+CONTENTS000644 000000 000000 00000007715 11043376541 012305 0ustar00rootroot000000 000000 @cwd /usr/pkg @src /usr/pkg @pkgcfl ja-gawk-[0-9]* @name gawk-3.1.6 @blddep pkg_install-info-4.5nb3 @pkgdep pkg_install-info-[0-9]* @blddep gcc34-3.4.6nb1 @pkgdep gcc34>=3.4.6 @blddep gettext-lib-0.14.6 @pkgdep gettext-lib>=0.14.5 @blddep digest-20070803 @blddep tnftp-20070806 @blddep gettext-tools-0.14.6nb1 @blddep patch-2.5.4nb2 @comment $NetBSD: PLIST,v 1.12 2007/11/02 07:17:59 adam Exp $ bin/gawk @comment MD5:6db4ff091d97456e2c1ff8e714f3e17d bin/gawk-3.1.6 @comment MD5:6db4ff091d97456e2c1ff8e714f3e17d bin/igawk @comment MD5:0999589a2447a946f087edc6116a820c bin/pgawk @comment MD5:19cdbee357aed2a8f36c4361e350c307 bin/pgawk-3.1.6 @comment MD5:19cdbee357aed2a8f36c4361e350c307 info/gawk.info @comment MD5:363013977ab0e398af645ab239dee9eb info/gawkinet.info @comment MD5:7def99bfd14dacfbcef81968922db932 libexec/awk/grcat @comment MD5:e3bae54c6bb2b093e4960870b2167d28 libexec/awk/pwcat @comment MD5:3308cd5e66566ad8aa13d1580cd89a80 man/man1/gawk.1 @comment MD5:9287d2020a24d8319b2b689270a47dab man/man1/igawk.1 @comment MD5:ef9598424ab06d38ec130bb78076406e man/man1/pgawk.1 @comment MD5:9287d2020a24d8319b2b689270a47dab share/awk/assert.awk @comment MD5:e9b376bed891ce012d972099ca4355c8 share/awk/bits2str.awk @comment MD5:e10f4cad40ea00ed5f0b5c7faa16f265 share/awk/cliff_rand.awk @comment MD5:4f102335ebacbb13af785af2a5ee5699 share/awk/ctime.awk @comment MD5:ce02f586211304984cec58040f95a922 share/awk/ftrans.awk @comment MD5:d3fb488decd780a765ba4252288e7d42 share/awk/getopt.awk @comment MD5:ef61bd5615a4c63f852363e10cfa5b5a share/awk/gettime.awk @comment MD5:b03ad575adcda2d0a78e115f50489259 share/awk/group.awk @comment MD5:7843aa237ec2426c9b2b3a1a4377e44f share/awk/join.awk @comment MD5:babd186770765508e26d344613ffbe0d share/awk/libintl.awk @comment MD5:cc11a880a2e1e277530c2d7d7cdac202 share/awk/nextfile.awk @comment MD5:b1654682ef5321981e1276fd9459c1ae share/awk/noassign.awk @comment MD5:c4659956ac11fe01d3899f888146b74f share/awk/ord.awk @comment MD5:1b35f85e1492c59ebc24bd2e643074f6 share/awk/passwd.awk @comment MD5:4fc2ea065882525604af6122459afe75 share/awk/readable.awk @comment MD5:cd6a027cbb856b516bb6b87402390701 share/awk/rewind.awk @comment MD5:c87adbdbc349b6e4c96d9494d7fc9a30 share/awk/round.awk @comment MD5:95c86d8b1e39844d564711d10787df86 share/awk/strtonum.awk @comment MD5:2778615ae48090f5c0b95dc6cb9746e9 share/awk/zerofile.awk @comment MD5:a69b061ef1bbca105082fe8a248818da lib/locale/ca/LC_MESSAGES/gawk.mo @comment MD5:e882fd87b28b13ffa26b4c79e4725f4b lib/locale/da/LC_MESSAGES/gawk.mo @comment MD5:f317557e713f816bf32bcc3745995529 lib/locale/de/LC_MESSAGES/gawk.mo @comment MD5:4ee16c2619e64b61eb6c6992cba6a212 lib/locale/es/LC_MESSAGES/gawk.mo @comment MD5:57c2cd12b8dfc03dc3affa0bb676fdb7 lib/locale/fr/LC_MESSAGES/gawk.mo @comment MD5:a5193b1dac28dd75d1ef8ab1266f50c7 lib/locale/ga/LC_MESSAGES/gawk.mo @comment MD5:9ee57f45e593821cd0e49086a19d6705 lib/locale/he/LC_MESSAGES/gawk.mo @comment MD5:d84770b94feb7edbc4a1ad609f0a0943 lib/locale/it/LC_MESSAGES/gawk.mo @comment MD5:238fcd91e6c6cac85e0ebb5128899648 lib/locale/ja/LC_MESSAGES/gawk.mo @comment MD5:610a8dcbbe8092d75b0501798cb8513f lib/locale/nl/LC_MESSAGES/gawk.mo @comment MD5:78c6f4f7ab615e540de7464453774a05 lib/locale/pl/LC_MESSAGES/gawk.mo @comment MD5:e2d3b187b735ca7be58e5b6f29bf4b90 lib/locale/pt_BR/LC_MESSAGES/gawk.mo @comment MD5:4827d75d3f0e9516ba3af6ec15577ce1 lib/locale/ro/LC_MESSAGES/gawk.mo @comment MD5:ce43fb4333d08d111c1a0234da2e4455 lib/locale/rw/LC_MESSAGES/gawk.mo @comment MD5:7ec2f56e32610be3a3a84133355d90bf lib/locale/sv/LC_MESSAGES/gawk.mo @comment MD5:249d14a444610979d6ed2bc50e0e6c47 lib/locale/tr/LC_MESSAGES/gawk.mo @comment MD5:163e6f90f4bc2cd5326bb02579c4c574 lib/locale/vi/LC_MESSAGES/gawk.mo @comment MD5:9774f907c67bab2a80f0879a7c847c82 lib/locale/zh_CN/LC_MESSAGES/gawk.mo @comment MD5:c2f9a39eca04650fc062e82adbd82ed6 @dirrm share/awk @dirrm libexec/awk @cwd . @ignore +COMMENT @ignore +DESC @ignore +INSTALL @ignore +DEINSTALL @ignore +BUILD_VERSION @ignore +BUILD_INFO @ignore +SIZE_PKG @ignore +SIZE_ALL +COMMENT000444 000000 000000 00000000010 11043376541 012125 0ustar00rootroot000000 000000 GNU awk +DESC000444 000000 000000 00000000162 11043376541 011551 0ustar00rootroot000000 000000 The GNU AWK utility, a pattern scanning and processing tool Homepage: http://www.gnu.org/software/gawk/gawk.html +INSTALL000755 000000 000000 00000017715 11043376464 012166 0ustar00rootroot000000 000000 #!/bin/ksh # # $NetBSD: header,v 1.2 2006/07/19 22:26:26 jlam Exp $ SELF="$0" PKGNAME="$1" STAGE="$2" shift 2 AWK="/usr/pkg/bin/nawk" BASENAME="/usr/bin/basename" CAT="/usr/bin/cat" CHGRP="/usr/bin/chgrp" CHMOD="/usr/bin/chmod" CHOWN="/usr/bin/chown" CMP="/bin/cmp" CP="/bin/cp" DIRNAME="/usr/bin/dirname" ECHO="/usr/ucb/echo" ECHO_N="/usr/ucb/echo -n" EGREP="/usr/xpg4/bin/grep -E" EXPR="/usr/xpg4/bin/expr" FALSE="/usr/bin/false" FIND="/usr/bin/find" GREP="/usr/xpg4/bin/grep" GTAR="" HEAD="/usr/bin/head" ID="/usr/xpg4/bin/id" LINKFARM="/usr/pkg/sbin/linkfarm" LN="/usr/bin/ln" LS="/usr/bin/ls" MKDIR="/usr/bin/mkdir -p" MV="/usr/bin/mv" PERL5="/usr/pkg/bin/perl" PKG_ADMIN="/usr/pkg/sbin/pkg_admin" PKG_INFO="/usr/pkg/sbin/pkg_info" PWD_CMD="/bin/pwd" RM="/usr/bin/rm" RMDIR="/usr/bin/rmdir" SED="/usr/pkg/bin/nbsed" SETENV="/usr/bin/env" SH="/bin/ksh" SORT="/usr/bin/sort" SU="/usr/bin/su" TEST="test" TOUCH="/usr/bin/touch" TR="/usr/bin/tr" TRUE="/usr/bin/true" XARGS="/usr/bin/xargs" CURDIR=`${PWD_CMD}` : ${PKG_METADATA_DIR=${CURDIR}} PKGBASE="gawk" LOCALBASE="/usr/pkg" X11BASE="/usr/openwin" DEPOTBASE="/usr/pkg/packages" PREFIX="/usr/pkg" case ${PKG_PREFIX} in ${LOCALBASE}/*) VIEW="${PKG_PREFIX#${LOCALBASE}/}" ;; *) VIEW="" ;; esac PKG_SYSCONFBASE="/usr/pkg/etc" PKG_SYSCONFDEPOTBASE="" PKG_SYSCONFBASEDIR="/usr/pkg/etc" PKG_SYSCONFDIR="/usr/pkg/etc" CONF_DEPENDS="" case ${VIEW} in "") PKG_SYSCONFVIEWBASE="${PKG_SYSCONFBASE}" ;; *) PKG_SYSCONFVIEWBASE="${PKG_SYSCONFBASE}/${VIEW}" ;; esac CONF_IGNORE_FILES="*[~#] *.OLD *.orig *,v .pkgsrc */.pkgsrc" PKG_INSTALLATION_TYPE="overwrite" case "${PKG_CONFIG:-YES}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) _PKG_CONFIG=yes ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) _PKG_CONFIG=yes ;; esac # $NetBSD: info-files,v 1.4 2007/07/12 19:41:46 jlam Exp $ # # Generate an +INFO_FILES script that handles info file registration for # the package. # case "${STAGE},$1" in UNPACK,|UNPACK,+INFO_FILES) ${CAT} > ./+INFO_FILES << 'EOF' #!/bin/ksh # # +INFO_FILES - info file registration management script # # Usage: ./+INFO_FILES ADD|REMOVE [metadatadir] # # This script supports two actions, ADD and REMOVE, that will add or # remove entries for info files from the package associated with # from the info index files (the "dir" file in the # same directory as the info files). # # Lines starting with "# INFO: " are data read by this script that # name the info files and directory containing the "dir" index that will # that will be updated. If the directory is not specified, then the # "dir" index is assumed to be in the same directory as the info file. # # # INFO: /usr/pkg/info/bar.info /usr/pkg/info # # INFO: /usr/pkg/info/baz.info /usr/pkg/info # # For each INFO entry, if the path is relative, that it is taken to be # relative to ${PKG_PREFIX}. # ECHO="/usr/ucb/echo" GREP="/usr/xpg4/bin/grep" INSTALL_INFO="/usr/pkg/bin/pkg_install-info" MKDIR="/usr/bin/mkdir -p" PWD_CMD="/bin/pwd" RM="/usr/bin/rm" RMDIR="/usr/bin/rmdir" SED="/usr/pkg/bin/nbsed" SORT="/usr/bin/sort" TEST="test" SELF=$0 ACTION=$1 CURDIR=`${PWD_CMD}` PKG_METADATA_DIR="${2-${CURDIR}}" : ${PKGNAME=${PKG_METADATA_DIR##*/}} : ${PKG_PREFIX=/usr/pkg} case "${INFO_FILES_VERBOSE:-no}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) echo="${ECHO}" ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) echo=":" ;; esac exitcode=0 case $ACTION in ADD) ${SED} -n "/^\# INFO: /{s/^\# INFO: //;p;}" ${SELF} | ${SORT} -u | while read file infodir; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac if ${TEST} ! -f "$file"; then : else case $infodir in "") infodir="${file%/*}" ;; [!/]*) infodir="${PKG_PREFIX}/$infodir" ;; esac infoindex="$infodir/dir" nentries="`${GREP} -c '^\*' $infoindex 2>/dev/null`" case "$nentries" in [0-9]*) ${TEST} $nentries -gt 0 || ${RM} $infoindex ;; esac $echo "${PKGNAME}: registering info file $file" ${MKDIR} -p "$infodir" ${INSTALL_INFO} --info-dir="$infodir" --delete $file >/dev/null 2>&1 ${INSTALL_INFO} --info-dir="$infodir" $file >/dev/null 2>&1 fi done ;; REMOVE) ${SED} -n "/^\# INFO: /{s/^\# INFO: //;p;}" ${SELF} | ${SORT} -u | while read file infodir; do case $file in "") continue ;; [!/]*) file="${PKG_PREFIX}/$file" ;; esac if ${TEST} ! -f "$file"; then : else case $infodir in "") infodir="${file%/*}" ;; [!/]*) infodir="${PKG_PREFIX}/$infodir" ;; esac infoindex="$infodir/dir" $echo "${PKGNAME}: unregistering info file $file" ${INSTALL_INFO} --info-dir="$infodir" --delete $file >/dev/null 2>&1 nentries="`${GREP} -c '^\*' $infoindex 2>/dev/null`" case "$nentries" in [0-9]*) ${TEST} $nentries -gt 1 || ${RM} $infoindex ;; esac ${RMDIR} -p "$infodir" 2>/dev/null || ${TRUE} fi done ;; esac exit $exitcode EOF ${SED} -n "/^\# INFO: /p" ${SELF} >> ./+INFO_FILES ${CHMOD} +x ./+INFO_FILES ;; esac # $NetBSD: install,v 1.2 2007/07/18 18:01:03 jlam Exp $ case ${STAGE} in PRE-INSTALL) # # Unpack the helper scriptlets. # ${SH} ${SELF} ${PKGNAME} UNPACK # # Require that necessary users and groups exist or else fail the # installation of the package. # ${TEST} ! -x ./+USERGROUP || { ./+USERGROUP ADD ${PKG_METADATA_DIR} if ./+USERGROUP CHECK-ADD ${PKG_METADATA_DIR}; then : else exit 1 fi; } # # Create package directories at pre-install time. # if [ "${PKG_INSTALLATION_TYPE}" = "pkgviews" -a \ "${_PKG_CONFIG}" = "yes" -a -n "${CONF_DEPENDS}" ]; then pkg=`${PKG_ADMIN} -b -d ${DEPOTBASE} -s "" lsbest "${CONF_DEPENDS}"` sysconfdir=`${PKG_INFO} -B -K ${DEPOTBASE} $pkg | \ ${AWK} '/^PKG_SYSCONFDIR=/ { \ gsub("^PKG_SYSCONFDIR=[ ]*", ""); \ print; \ }' \ ` if [ -d $sysconfdir -a ! -d ${PKG_SYSCONFDIR} ]; then ${MKDIR} -p `${DIRNAME} ${PKG_SYSCONFDIR}` ${LN} -sf $sysconfdir ${PKG_SYSCONFDIR} fi fi ${TEST} ! -x ./+DIRS || ./+DIRS ADD ${PKG_METADATA_DIR} ${TEST} ! -x ./+DIRS || ./+DIRS PERMS ${PKG_METADATA_DIR} ;; POST-INSTALL) # # Rebuild the system run-time library search path database. # ${TEST} ! -x ./+SHLIBS || ./+SHLIBS ADD ${PKG_METADATA_DIR} # # Copy configuration/support files into place. # ${TEST} ! -x ./+FILES || ./+FILES ADD ${PKG_METADATA_DIR} ${TEST} ! -x ./+FILES || ./+FILES PERMS ${PKG_METADATA_DIR} # # Set special permissions on any files/directories that need them. # ${TEST} ! -x ./+PERMS || ./+PERMS ${PKG_METADATA_DIR} # # Update any fonts databases. # ${TEST} ! -x ./+FONTS || ./+FONTS ${PKG_METADATA_DIR} # Check for any missing bits after we're finished installing. # ${TEST} ! -x ./+DIRS || ./+DIRS CHECK-ADD ${PKG_METADATA_DIR} ${TEST} ! -x ./+DIRS || ./+DIRS CHECK-PERMS ${PKG_METADATA_DIR} ${TEST} ! -x ./+FILES || ./+FILES CHECK-ADD ${PKG_METADATA_DIR} ${TEST} ! -x ./+FILES || ./+FILES CHECK-PERMS ${PKG_METADATA_DIR} ;; VIEW-INSTALL) # # Register shells in /etc/shells. # ${TEST} ! -x ./+SHELL || ./+SHELL ADD ${PKG_METADATA_DIR} ${TEST} ! -x ./+SHELL || ./+SHELL CHECK-ADD ${PKG_METADATA_DIR} # # Register info files. # ${TEST} ! -x ./+INFO_FILES || ./+INFO_FILES ADD ${PKG_METADATA_DIR} # If ${PKG_SYSCONFBASE} points outside of ${PREFIX}, then add the # package config files to the proper view. # if [ "${_PKG_CONFIG}" = "yes" -a -n "${PKG_SYSCONFDEPOTBASE}" ]; then ${SETENV} PLIST_IGNORE_FILES="${CONF_IGNORE_FILES}" \ ${LINKFARM} -t ${PKG_SYSCONFVIEWBASE} -d ${PKG_SYSCONFDEPOTBASE} ${PKGNAME} fi ;; esac # $NetBSD: install-post,v 1.1 2006/05/21 23:50:15 jlam Exp $ # Ensure that the VIEW-INSTALL action is called for overwrite packages. # This is here to ensure that it's the final POST-INSTALL action (after # any INSTALL_TEMPLATE POST-INSTALL actions). # case ${STAGE} in POST-INSTALL) if [ "${PKG_INSTALLATION_TYPE}" = "overwrite" ]; then ${SETENV} PKG_PREFIX="${PKG_PREFIX}" \ $0 ${PKGNAME} VIEW-INSTALL fi ;; esac # $NetBSD: footer,v 1.1 2006/05/21 23:50:15 jlam Exp $ exit 0 # INFO: info/gawk.info # INFO: info/gawkinet.info +DEINSTALL000755 000000 000000 00000010137 11043376405 012361 0ustar00rootroot000000 000000 #!/bin/ksh # # $NetBSD: header,v 1.2 2006/07/19 22:26:26 jlam Exp $ SELF="$0" PKGNAME="$1" STAGE="$2" shift 2 AWK="/usr/pkg/bin/nawk" BASENAME="/usr/bin/basename" CAT="/usr/bin/cat" CHGRP="/usr/bin/chgrp" CHMOD="/usr/bin/chmod" CHOWN="/usr/bin/chown" CMP="/bin/cmp" CP="/bin/cp" DIRNAME="/usr/bin/dirname" ECHO="/usr/ucb/echo" ECHO_N="/usr/ucb/echo -n" EGREP="/usr/xpg4/bin/grep -E" EXPR="/usr/xpg4/bin/expr" FALSE="/usr/bin/false" FIND="/usr/bin/find" GREP="/usr/xpg4/bin/grep" GTAR="" HEAD="/usr/bin/head" ID="/usr/xpg4/bin/id" LINKFARM="/usr/pkg/sbin/linkfarm" LN="/usr/bin/ln" LS="/usr/bin/ls" MKDIR="/usr/bin/mkdir -p" MV="/usr/bin/mv" PERL5="/usr/pkg/bin/perl" PKG_ADMIN="/usr/pkg/sbin/pkg_admin" PKG_INFO="/usr/pkg/sbin/pkg_info" PWD_CMD="/bin/pwd" RM="/usr/bin/rm" RMDIR="/usr/bin/rmdir" SED="/usr/pkg/bin/nbsed" SETENV="/usr/bin/env" SH="/bin/ksh" SORT="/usr/bin/sort" SU="/usr/bin/su" TEST="test" TOUCH="/usr/bin/touch" TR="/usr/bin/tr" TRUE="/usr/bin/true" XARGS="/usr/bin/xargs" CURDIR=`${PWD_CMD}` : ${PKG_METADATA_DIR=${CURDIR}} PKGBASE="gawk" LOCALBASE="/usr/pkg" X11BASE="/usr/openwin" DEPOTBASE="/usr/pkg/packages" PREFIX="/usr/pkg" case ${PKG_PREFIX} in ${LOCALBASE}/*) VIEW="${PKG_PREFIX#${LOCALBASE}/}" ;; *) VIEW="" ;; esac PKG_SYSCONFBASE="/usr/pkg/etc" PKG_SYSCONFDEPOTBASE="" PKG_SYSCONFBASEDIR="/usr/pkg/etc" PKG_SYSCONFDIR="/usr/pkg/etc" CONF_DEPENDS="" case ${VIEW} in "") PKG_SYSCONFVIEWBASE="${PKG_SYSCONFBASE}" ;; *) PKG_SYSCONFVIEWBASE="${PKG_SYSCONFBASE}/${VIEW}" ;; esac CONF_IGNORE_FILES="*[~#] *.OLD *.orig *,v .pkgsrc */.pkgsrc" PKG_INSTALLATION_TYPE="overwrite" case "${PKG_CONFIG:-YES}" in [Yy][Ee][Ss]|[Tt][Rr][Uu][Ee]|[Oo][Nn]|1) _PKG_CONFIG=yes ;; [Nn][Oo]|[Ff][Aa][Ll][Ss][Ee]|[Oo][Ff][Ff]|0) _PKG_CONFIG=yes ;; esac # $NetBSD: deinstall-pre,v 1.1 2006/05/21 23:50:15 jlam Exp $ # Ensure that the VIEW-DEINSTALL action is called for overwrite packages. # This is here to ensure that it's the first DEINSTALL action (before # any DEINSTALL_TEMPLATE DEINSTALL actions). # case ${STAGE} in DEINSTALL) if [ "${PKG_INSTALLATION_TYPE}" = "overwrite" ]; then ${SETENV} PKG_PREFIX="${PKG_PREFIX}" \ $0 ${PKGNAME} VIEW-DEINSTALL fi ;; esac # $NetBSD: deinstall,v 1.2 2007/07/18 18:01:03 jlam Exp $ case ${STAGE} in VIEW-DEINSTALL) case ${_PKG_CONFIG} in yes) case ${PKG_SYSCONFDEPOTBASE} in "") ${TEST} ! -x ./+FILES || ./+FILES VIEW-REMOVE ${PREFIX} ${PKG_PREFIX} ;; *) ${SETENV} PLIST_IGNORE_FILES="${CONF_IGNORE_FILES}" \ ${LINKFARM} -D -t ${PKG_SYSCONFVIEWBASE} -d ${PKG_SYSCONFDEPOTBASE} ${PKGNAME} ${RMDIR} -p ${PKG_SYSCONFVIEWBASE} 2>/dev/null || ${TRUE} ;; esac ;; esac # # Unregister info files. # ${TEST} ! -x ./+INFO_FILES || ./+INFO_FILES REMOVE ${PKG_METADATA_DIR} # # Remove shells from /etc/shells. # ${TEST} ! -x ./+SHELL || ./+SHELL REMOVE ${PKG_METADATA_DIR} ${TEST} ! -x ./+SHELL || ./+SHELL CHECK-REMOVE ${PKG_METADATA_DIR} ;; DEINSTALL) # Remove configuration files if they don't differ from the default # config file. # ${TEST} ! -x ./+FILES || ./+FILES REMOVE ${PKG_METADATA_DIR} ;; POST-DEINSTALL) if [ "${PKG_INSTALLATION_TYPE}" = "pkgviews" -a \ "${_PKG_CONFIG}" = "yes" -a -n "${CONF_DEPENDS}" ]; then if [ -h ${PKG_SYSCONFDIR} ]; then ${RM} -f ${PKG_SYSCONFDIR} fi ${RMDIR} -p `${DIRNAME} ${PKG_SYSCONFDIR}` 2>/dev/null || ${TRUE} fi # # Update any fonts databases. # ${TEST} ! -x ./+FONTS || ./+FONTS ${PKG_METADATA_DIR} # # Rebuild the system run-time library search path database. # ${TEST} ! -x ./+SHLIBS || ./+SHLIBS REMOVE ${PKG_METADATA_DIR} # # Remove empty directories and unused users/groups. # ${TEST} ! -x ./+DIRS || ./+DIRS REMOVE ${PKG_METADATA_DIR} ${TEST} ! -x ./+USERGROUP || ./+USERGROUP REMOVE ${PKG_METADATA_DIR} # # Check for any existing bits after we're finished de-installing. # ${TEST} ! -x ./+USERGROUP || ./+USERGROUP CHECK-REMOVE ${PKG_METADATA_DIR} ${TEST} ! -x ./+FILES || ./+FILES CHECK-REMOVE ${PKG_METADATA_DIR} ${TEST} ! -x ./+DIRS || ./+DIRS CHECK-REMOVE ${PKG_METADATA_DIR} ;; esac # $NetBSD: footer,v 1.1 2006/05/21 23:50:15 jlam Exp $ exit 0 +BUILD_VERSION000644 000000 000000 00000000605 11043376510 013077 0ustar00rootroot000000 000000 lang/gawk/distinfo: $NetBSD: distinfo,v 1.18 2007/11/02 07:18:00 adam Exp $ lang/gawk/Makefile: $NetBSD: Makefile,v 1.38 2007/11/02 07:17:59 adam Exp $ lang/gawk/patches/patch-ab: $NetBSD: patch-ab,v 1.11 2007/11/02 07:18:00 adam Exp $ lang/gawk/patches/patch-ad: $NetBSD: patch-ad,v 1.4 2007/11/02 07:18:00 adam Exp $ lang/gawk/PLIST: $NetBSD: PLIST,v 1.12 2007/11/02 07:17:59 adam Exp $ +BUILD_INFO000644 000000 000000 00000010746 11043376537 012525 0ustar00rootroot000000 000000 ABI= BUILD_DATE=2008-07-28 12:09:46 -0500 BUILD_HOST=SunOS marcie.christtrek.org 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10 CATEGORIES=lang CC_VERSION=gcc-3.4.6 CFLAGS=-O -O2 -I/usr/pkg/gcc34/include -I/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/include -I/usr/include -I/usr/pkg/include CMAKE_ARGS= CONFIGURE_ARGS=--with-libintl-prefix="/usr/pkg" --with-libiconv-prefix=/usr/pkg --prefix=/usr/pkg --host=sparc-sun-solaris2 --infodir=/usr/pkg/info --mandir=/usr/pkg/man CONFIGURE_ENV=INSTALL_INFO=/usr/pkgsrc/lang/gawk/work.sparc/.tools/bin/install-info MAKEINFO=/usr/pkgsrc/lang/gawk/work.sparc/.tools/bin/makeinfo AWK=/usr/pkg/bin/nawk CAT=/usr/bin/cat ac_cv_path_CAT=/usr/bin/cat CHMOD=/usr/bin/chmod CMP=/bin/cmp CP=/bin/cp DIFF=/bin/diff ECHO=/usr/ucb/echo ac_cv_path_ECHO=/usr/ucb/echo EGREP=/usr/xpg4/bin/grep\ -E ac_cv_path_EGREP=/usr/xpg4/bin/grep\ -E SETENV=/usr/bin/env ENV_PROG=/usr/bin/env ac_cv_path_ENV=/usr/bin/env FALSE=/usr/bin/false ac_cv_path_FALSE=/usr/bin/false FIND=/usr/bin/find GREP=/usr/xpg4/bin/grep ac_cv_path_GREP=/usr/xpg4/bin/grep HOSTNAME=/bin/hostname LN=/usr/bin/ln LS=/usr/bin/ls MKDIR=/usr/bin/mkdir\ -p MV=/usr/bin/mv RM=/usr/bin/rm RMDIR=/usr/bin/rmdir SED=/usr/pkg/bin/nbsed SORT=/usr/bin/sort TAR=/usr/pkg/bin/tar TEST=test ac_cv_path_TEST=test TOUCH=/usr/bin/touch TR=/usr/bin/tr TRUE=/usr/bin/true ac_cv_path_TRUE=/usr/bin/true PKG_CONFIG= PKG_CONFIG_LIBDIR=/usr/pkgsrc/lang/gawk/work.sparc/.buildlink/lib/pkgconfig:/usr/pkgsrc/lang/gawk/work.sparc/.buildlink/share/pkgconfig PKG_CONFIG_LOG=/usr/pkgsrc/lang/gawk/work.sparc/.pkg-config.log PKG_CONFIG_PATH= MAKE=make PTHREAD_CFLAGS=\ -D_REENTRANT PTHREAD_LDFLAGS= PTHREAD_LIBS=-lpthread\ -lrt PTHREADBASE=/usr WRAPPER_DEBUG=no WRAPPER_UPDATE_CACHE=yes CC=gcc CFLAGS=-O\ -O2\ -I/usr/pkg/gcc34/include\ -I/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/include\ -I/usr/include\ -I/usr/pkg/include CPPFLAGS=-I/usr/pkg/gcc34/include\ -I/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/include\ -I/usr/include\ -I/usr/pkg/include CXX=g++ CXXFLAGS=-O\ -O2\ -I/usr/pkg/gcc34/include\ -I/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/include\ -I/usr/include\ -I/usr/pkg/include\ -O2 COMPILER_RPATH_FLAG=-Wl,-R F77=f77 FC=f77 FFLAGS=-O LANG=C LC_COLLATE=C LC_CTYPE=C LC_MESSAGES=C LC_MONETARY=C LC_NUMERIC=C LC_TIME=C LDFLAGS=-L/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6\ -Wl,-R/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6\ -L/usr/pkg/gcc34/lib\ -Wl,-R/usr/pkg/gcc34/lib\ -L/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/\ -Wl,-R/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/\ -L/usr/lib\ -Wl,-R/usr/lib\ -L/usr/pkg/lib\ -Wl,-R/usr/pkg/lib LINKER_RPATH_FLAG=-R PATH=/usr/pkgsrc/lang/gawk/work.sparc/.wrapper/bin:/usr/pkgsrc/lang/gawk/work.sparc/.buildlink/bin:/usr/pkgsrc/lang/gawk/work.sparc/.gcc/bin:/usr/pkgsrc/lang/gawk/work.sparc/.tools/bin:/usr/pkg/bin:/usr/sbin:/usr/bin:/usr/ucb:/usr/ccs/bin:/usr/xpg4/bin:/usr/dt/bin:/usr/X11/bin:/usr/pkg/sbin:/usr/pkg/bin:/usr/openwin/bin:/usr/sfw/sbin:/usr/sfw/bin:/usr/local/bin:/usr/pkg/bin:/usr/openwin/bin PREFIX=/usr/pkg PKG_SYSCONFDIR=/usr/pkg/etc CXXCPP=gcc\ -E HOME=/usr/pkgsrc/lang/gawk/work.sparc/.home CONFIG_SHELL=/bin/ksh LIBS= ac_given_INSTALL=/usr/ucb/install\ -c\ -o\ root\ -g\ root CPPFLAGS= -I/usr/pkg/gcc34/include -I/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/include -I/usr/include -I/usr/pkg/include FFLAGS=-O HOMEPAGE=http://www.gnu.org/software/gawk/gawk.html LDFLAGS= -L/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6 -Wl,-R/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6 -L/usr/pkg/gcc34/lib -Wl,-R/usr/pkg/gcc34/lib -L/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/ -Wl,-R/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/ -L/usr/lib -Wl,-R/usr/lib -L/usr/pkg/lib -Wl,-R/usr/pkg/lib LICENSE= LOCALBASE=/usr/pkg MACHINE_ARCH=sparc MACHINE_GNU_ARCH=sparc MAINTAINER=bouyer@NetBSD.org NO_BIN_ON_CDROM= NO_BIN_ON_FTP= NO_SRC_ON_CDROM= NO_SRC_ON_FTP= OBJECT_FMT=ELF OPSYS=SunOS OS_VERSION=5.10 PKGINFODIR=info PKGMANDIR=man PKG_OPTIONS= PKGPATH=lang/gawk PKG_SYSCONFBASEDIR=/usr/pkg/etc PKG_SYSCONFDIR=/usr/pkg/etc PKGTOOLS_VERSION=20080423 _PLIST_IGNORE_FILES= REQUIRES=/lib/libc.so.1 REQUIRES=/lib/libdoor.so.1 REQUIRES=/lib/libgen.so.1 REQUIRES=/lib/libmd.so.1 REQUIRES=/lib/libmp.so.2 REQUIRES=/lib/libm.so.2 REQUIRES=/lib/libnsl.so.1 REQUIRES=/lib/libscf.so.1 REQUIRES=/lib/libsocket.so.1 REQUIRES=/lib/libuutil.so.1 REQUIRES=/usr/pkg/gcc34/lib/libgcc_s.so.1 REQUIRES=/usr/pkg/lib/libiconv.so.2 REQUIRES=/usr/pkg/lib/libintl.so.3 RESTRICTED= _USE_DESTDIR=no +SIZE_PKG000644 000000 000000 00000000010 11043376540 012277 0ustar00rootroot000000 000000 3453795 +SIZE_ALL000644 000000 000000 00000000012 11043376511 012266 0ustar00rootroot000000 000000 474956492 bin/gawk000555 000000 000000 00001171764 11043376423 012505 0ustar00rootroot000000 000000 ELFG4 4 (44(((( \@(DD/usr/lib/ld.so.1  !"$&'()+,./0123458:;=?BCEJKMNOQSUVWYZ[]^_`acdehijknopruxy{|}    !$'(*,./01235679;<=@BDEHIJKMNPQRTVWYZ[\_abcefhiklmnoqrtvwxz{}~ #%*-679<>@ADFGHILPRTX\bfglmqstvwz~  "#%&)+-48:>?ACFGLOSUX]^`dgjpsuy|( X"(X -Q 9K E R]( \ cf q{4 voL  h: C <q )D Dp(@t  |tJdH *@@!/0  >d GP$Ve s P L$ df  0PD   &ޘ*<1 <\` Gh< O4U _ v 8\ A C< x  $\܈ =T h< D")4 24 =DHM% X_gH y M4  h@ (hh 0 ΐx ޼1  X 0  %\  , !S| 4:ߠB( JۘO% ^ e PL x t[/D<  ݄  n0߬(@ 4 < %t  (P  9d !D< (08 )@@,l8i< AFD< Q74 X7  _% l)4 yy  !x 7\, T8  ]4,  L4 -7L 9ݜBܬIx P440 X `ްeMT\ n9h z   988 (  ( xP x   (P  p 18?>Ht H8PیW0 ]ߔb7 wP` ptl %,  9  t  i X &4 P= 08 }Sݨ_g u8J}8 ~d "$@ m,IۤDX 3p hD s @ ,)4 ( < \ 18 B  Qh Z g r vd } ހ 0  %d k@L l ܠ )L ` [  < Vt   t " (< 1T =;X F N4 V  ]  d! n  , 5x }H yD \ T  e(  d( u | DP P 0<    x qw 4 M4 9xh $Lݴ ,7X 9LT B$' NT| W [ c q z A@  Xl ` P d x X \ T (8   px  h4 ' 08\ n7  :s4 F@ || Nk X< _Z i@ n$ |  l L  @P % /, ^` L L\ I  Bތ ,    # s + 2 <  K߸ Q  WH hݐ p w H  A  D  X   Ӑl   *  V` [  |߈` &/6l @0G NTUd\hfv7,  #@&  @~ cȢ`$ @#c<@ <` <` <` @<` `$$`$ $ 4`$$``  @ `ה   @R $$ $ $ ` #@`@ X -Q,+P`Q` #a@^f@^C@^J  $`@^:$`@^cc@``@$`* @$@ @ "+'`@@^$`Q`!#˒a@^6`@@^" $$ $ `E #@`@(' ?QapH?. @] {@^  H-@`"@)-%Ȃ S $$  ``$ 4 $@]ؐ  K$ `$ `@]`  +@` `$`  `$ 3`$$%@`"Ƞ`2@$Ԡ@b$ $%@`Ȯ*-%`#@aP@]"@] @]`QQa0@@P#|@y!P@]y"@]``QPaX@nP#i@e!P@]e"@]s`QPaXXٖ@ cX` X` 㿐N b+  3  2N8 8`(` @ 0`(`@ @ (`0`  @ & @]C`? `?@"Ѐ@ #" `2" #" "ԁ c8  Z* `@  gggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggggg㿐 `6 `JYY!ha@\-v    ` #` a @Y#`㿐@\~   cȐ`#c@$Y)@\!Y@\\!ؠ@\j`YYb@R $$ $ " " 㿐 `PcȐ`#cȂ Q"  2 " "" " @ QQc  ;   `@    㿐c` c#c<'L'H'P'T'X  7H`B3!#X3&b@\ /@b Y" @Ȓ'@ /@P9"@['@ @[ ec<`u7"H@  @/@H@ ` @(`8`` `/@H@ ` ^/@` /@V`b`"!K@Hc@@ :@O@`@` "/@`@ *O@@/@b Y" @z'@ /@9`  cD " L`  ? 2L (`8`` d?&bY@["(?Y% @~!Y@[~!ؠ@[`YYbPX@t@[Y"`H@@[7쀠`;13b`@i +`1#@ -؀``)@ `! 0$#@xw'?9$@mX  5䀠` @b b@[9 s$&b  c cH9#cD'#< %@耢?"fY " c`"Sb` @[5#@耢 b@ b܂`%'bb`@ g 19%#D#H#<@#@ # @ @  L` " ? :Lbb 5#D@g#<@@]bz@b@#@@" @&#D'%#H'#<$@ @耢?2 Y%@!Y@Z"h @Z`@c@Zs @ @Z` c`bSb`"Yb܂`'b3b@Z"Y!@%V`@b`@Z L bY!%@ @&䀢 5 @Zp $Y%@Z!Y@ZZ!ؠ@Zh`YYbX@P"@Z@#H#< @#@#Y3b@Z@"Y!@8%`@c1@Z@΀ Y@Z&" jyx`c#"&;3#< c@ !" | b#cD c<#cH#Y%$#@!Y@Z"@Z`@`H` `5䀠`N@bb Xb@Y W$&b#(`@`@Ybb +@b,b9 c'#<#c cDb#<` c@8'b``#"]&Y!Ȓ%@Y@Y!ؠ@Y`YYbX@@Y  bY!%f@Y$"9 c@Y Y!ג%i 㿐#ch!%@" #@  $ch@Y  $" Y@Y~ $"Y!&!Ȓ&@dY@Yd!ؠ@Yr`YYc 0@Zch"@ch@ #cP$x``V'< c@  ~?c`'cs`#)c#xJ `L<'+<c@@  G% \@ @ ``\``` ''''''<@YK `?8`? "  ?;<@c@ '-ט <  c@   ,$< '?<@` -\# $\# # # # ' #x(@ <@߂` #x(@  #x(@ 㿐% `#i?5 # 'c @```!< #cD ?"<L  ?E ? ߂ c`$c` '#@㿐Qc  :N ?3`@;`. @(`K@ @X_`??㿐cȐ`#ccH " 2 $cD :K c` c@2 c" 㿐ؐ"" 㿐cX`#cX@X%c@# @cȐ`#c@‚c$, @ " @ " " " &`  R"  㿐cȐ`#c#L" "`##L *" 2 Ɠ@e#L" "`##L *" 2 㿐@Wސc@#@ ¢* c$@ "  @  2  " KL@ @@W 2 㿐А   `M,Y`1@W0-c   L N@     H H`Y ^@W 2 ؠ,@u!Y@Wu#@@u @ `@ (  ``㿐Y $#   ` 3Y`@cY#  ` 3Y` c@m3Yc@W@@W~@W1Y` ` "@` @Ww#㿐+cX@W5*  Z ; c`Yc@Wj dZšc$  ,@$` ,`,cX@ZY (a@W&*_0@WJ  Q+Z-Z/ZKc`, ` `8`M @W+  ` `HU@X  `FK `G9 @ϊnܦY*@ǐ!Y@Vǐ!ؠ@V`cXZZ`p@*@V  @V`@Z@V @c`‚c`@V 2Z@V@@V @V`@q0@Vצ@V`㿐¨c$ , $' @ഀ@@@`" ` `M`H  `F `G @ 00؃,` @( `@㿐–c$  ,`` `Md? 2 `c,` V@(`@V> 2c$   ,` "`  "` ` `M  " " " `  `c,``┐@VS  @& @VY+&@!Y@U!ؠ@V`ZZ`Ȕ@`@``@ 0㿐'T  b``#b  @Uܑ*  c$   ,` "`  "` ` `M  " " "`  `c,`TZY a@UĔ+\`cT┐@U  @2 @`?``?@ ! P`   5Z@-`@ `@Ur @@M@-``@Ӻ` @U{ 2#`ch@,Z@UX!(Y!@P+h`@0 Y+O@H!Y@UH! @UV`T@ZZaH@;*Y!@2+MZ@U2!X@2㿐@U,c@#@ ‘* c$ -)+ % @2`" KL @@UC 2#X$c%#X$$ %cȀ`4 $@U㿐   㿐@Tc@#@ '* @@T̒ #`  2@TҐ 6$$ $ @Tʐ $@T`2   `4 @$ 4#@`4 "  `+4 `(4 Y,:@!Y@T!ؠ@T`ZZax@Y,8@!Y@T!ؠ@T`ZZax@~ 㿐@Ty @T~% ` Y,@d!Y@Td!ؠ@Tr`ZZa@Z$@@Ti$`$ 㿐c` J@`."'J`Z!@TjcZ@Tg!1#P "@e #P`&#P#P` (@`Z"`@TU!@Tz#P`J@`.ZJ``/Zc@TC!Z@Tl Z@T?!@Td#P㿐     .  2 .Q(`c@``"8@`"Yc(`@ ` $|a$cZa[3`)`%`ȀqłbdӂaTc`b"Mc`aD"a $0) `P f& SZ `@` `Iw`G8X`F:`"3`*`"Z@S!`Q@ cXQbxp  `P" 7$  `"c`{c`"Y!@g)Z" @Sf@f `P & 2Zc@ a $  )! *`8Z  `@ `P $@ 2} `@ `# uc`"pZ@S%"PY)@!Q@cXQbx`@[ Yc`Sb` c`"IY!@)Z"Sb`2 Z3b@R" Y!@)`@v` `I+`$`& @ `I! $`"hc`  `` J@`.ZJ``/"`!@RcZ@R!!#P "@ #P`$#P|#P` (@`"`Z@Rΐ"#P "@͘ #P`$#Pd#P` (@`"`Z@R"@R#P`ZW#`c@) a O  )L  `Ic $`"cZh1" Z`$bc0 )- 6 )}@P!Z@RP#8@O@Z3b@RI"Y!@A)`@;Z#h@R:@~@R Z@R Z㷐`' c'?? " š Ȃ!# ' '' @:6&  ;`# `#@''(`@R   @R   ?@','@Q`'@Q  @@ڴ?X@bP@#"S  c `Հa- Xa@ @ d@V@aNP@ @ TSc@`Sb@ #@+` ' `x-`aP@`? `?@  ` ,XVbaNT ` '?V@S#`d@@R `R `쀦`´>Rc `^? c `2q@` `2l@` `I2g]@bhH#`  5㌀``Sb̀`SSc*`S Z3c*@Q0#Y!@("`@SbH @ S& @aԛ+ & PzV d@ >V@aNP@ @ ZTSadPzwX2?##  `@@Q 0 c 1 `P@ `M`' `?"  ´cb>'r`[" CX?  '''`;c< " cD (?'c<)c<##4%#H`$bq%b###4$cx 9V cM` [(@`P@ $@  [ [w \ /"? 2(@  c<c`c '#@c<` [#D@ 'c<[ @PaG(@`#P@  $b€` "! c!&$## rc`#c  `? `? c<``%#H`$b "ccxH@ `‚ `~w(`cP@c`c 'M @= ]tK@`[`k@ g`@ 2dK``^2`_ :"` c<c`c '#@c<`H#D@D@'c<=w(@? e  \(@`P@ 5$(@`cP ) b#`##`P@ #a+c ㌂!+`###Tc`2!+[@O (Y!Ȓ&@`@ 4c!+&$:" & ` c<c`c ' @c<   &cD  &?'c< & c&$#c = ` c<c`c ' @c<   %cD  %?'c< % c}&$"  ~?#a+ ㌂!+`###Tc`2!+[@O* (Y!'C$##- 9xJ` \? *(@`P@ $ "   ` \ꀤ? (@`cP@ $ۨ h؀?Ƹ $## =  ~ ` c<c`c ' @c<   !cD  !?'c< ! c&#`##!+ c$ c,!+#$a+#cj ㌂!+`###Tc`2!+[@N (Y!'2€ _ c‚ `@  [#`? _ `?@"c`$ –`$ `@ `?@ ' `@  _`? (@`#P@ $0 ) 00 0&   `;"    Gؠ  H Ð 1   "       /ݸ㌀` Sc0`   Jc`˸Sc2`2S [3c2@M p@S J J 9   =c`2 ][  H  L   z ㌀`"bȀ`"`2[@M Y!@#`@ =Za T[ NU HO BI <C 6= 07531 - @M\"        `-[@M>!($  ㌀`Sc.`  c`   Hs ;   Hj ;㌀`Sc,`  #`   HS ;ϔ ָ耠`42 ` ` `)"` `6¸PS #b#"  :` c8`2S[@Lː!XS 8 㔀` n㌀`Sc(` B b̀` L  ?{ b̀`2 5[  7p w  3j qo mk ige (XT O[㌀`"` `P" 2[DKc`2[  H L6=` `P"[)0 #* $㌀`"` `P[ `@ `*`? "`"   $ !#8`U$#8  $ !#8`;$#8 c8   Ԑ@K JY  ` Sb̀`" I[[@K"`bQ`aQax@~c`#c#`'' [b[b  `H@`+ Ғ    ( + ( ~z +t `Ey` `=uS``"qS` `E2mS[@K"tfS b`#b b#bZ X V  ) IRL' )? FDB @> < : 8 ]60'U,*(  D " '! $#c ! cq&$#€`|"## cd&$#c | ~ #`? &`?  }b E€  cb`! !  cB&$## c$" = <` c<c`c ' @c<  cD ?'c<c` ^c` 2  ^ ^ c&c`$#c c  2 $"(@`#P@ $?Ҁ`JKw(`b$@c`AⰂ`@ !Y `J` `' c<c`c ' @c< cD ?'c<:à` c<c`c ' @c<  ?cD ??'c` c<c`c ' @c<  cD ?'c<b`b` ! #c @"! &[@H"nb#`##ZcHX V `-O'M @Hs㌀`  "G[K@`*.@cȀ K#cȂ P$  @~@$  @   $ $ 4 $"c4`#c4  F ]bh@{ݔ a   `I2 $`2` !<    @H @} N"    %[ `` `P2 @G8@z˒ ' b#b'c ,` "`-['Y%)[㌀`" V `"'  " `㌀`" V `'@Gp@z,W@c`  c ``#c  #b̐  $s !#`$#tcȀ #cȂ K$  ]$$  $W !#8`z$#8XV'T $` !<IG bB#bВ ,5<:8] $b2 $4  c8 R  & -@GQ "Y $@  `,@GLc` #c cLc`  c$``3#c$  b#bȐ  $ !#`$# ) -ոӸ `A'耢 " `F"`H`*" $[@F#  H-   .@F͐#@yƒ,[@  `c,`c ,`@F @Fː 2`c$,`SZ` c`c '#@c<` i#D@i'c<i`?s`? <!#c`"&[\@F Y!@yx' `c#@%!\  X\ \L h 0R@F]#Y!@yU'`@!#`@##㌀`"?` "\@F@ РY!@y8!f`@ 2  ' P YcH@  M "%@F   %* cT`#cT'xD?@FU?@y a##""@@{ٔ#c $`2 $`"!c$hc 2$`!! c &b2[`WY``K  H@퓒 0`$#`#"㌀`"` "\@E РY!@x"`@ "g `' 'g  `' '^ ga'+@`P@$D#"@E#@ &bb@E" ?` c<c`c ' @c<  cD ?'c<b ㌀`8,`Q(`㔂` \@EC Y!@x;)`@\@E3!Y!@x+)`@\@E#!0Y!@x)!`@c`Q(`#` a\@E!P@wc` Q(`㔂@ ` $*c` QQ#(`@ ` "Qc(`@ `~׀`8L` c@DQ#(`@ ` #c&#cc`@  \Y!aȒ"i@wTY) @wK!Y@DK! @DY`bb\\ @ aؔ@w= ' b`T2N[\Y!֒-!'!' cX&!  #c"! O&` c<c`c ' @c<  !,cD !,?'c<!, c4& #͔ # `# Œ #$#˸\@C!@v˘ ŸS!(!( c&! #c #c #맔 #8 `# 럒 #$#8 #뙔 #8 `#  둒 #$#8昸S攸S!@v+\"(@C@v`% %w  `% %n wq'` `2e@@ 2a #` e@C"Y!@v#+`@A@C{ @vX @Cu!@vR0\3c(@Cn"hY!@vf!`@c`[#c@C]!bQ`aQaxQ@v@b c`\ c@CJ"h@v6@CD!Y!@v<#N`@@{i*@v/!Y@C/!ؠ@C=`\\b    ,',@ @C@ 퀥\@C"`@@u@C`S! #c Ae c!#c !#c&‚ `@ +@`P$O+cP  F bD0B` c<c`c ' @c< <cD 7?3'c<c =;` c<c`c ' @c< " cD (?'c<# ` ^㌂ `## \@B"Y!@u'`@c\`#@Bx@uU ^#` ㌂ `##\@Bf#0Y!@u^'`@c` \@BU#X@u2 5"Y@uH"qY@BH!ؠ@BV`\\c.`@BEǤ H`*2\@B0#Y!@u(!K`@b@B!"Y!@u!H`@h"t $@y"p $\@B !@tc  #ה #8 `#  ϒ #$#8ո@urgҸS  ȸ` c<`c '#@c<`#D\c@A@A ! #c !!#cߘ @(\'c<ɰ c`#c!+ c+!+! #c  c ##!%!% c&@A"0@tv  5q x$ @y͐) #h # `# ` #$#f >#c  >#c&_[S H KR!@tq#\@Aq#@tq@Am!bQ`aQaxQJb @A^ @t;]@AY @t6 @Ak! &(Y"`@tF!Y@AF!ؠ@AT`\\c"]3c0@A6 PY!@t.#`@5 ` ` `)]Y a@AC!` F`?H`?  @*ϒ  `@ `*`? Œ  @@؀  ` @@耢   <$ @A @A S$@@ PӒ0$  "'` c<c`c ' @c<   _cD (K ?'c< _F ! c&@Aax 2! ]4#@@ Y!@s)?`@!㌀`T#Tc`O[@@ (Y!@s)`@ ?4c"]3c.@@ Y!@s"9`@^]3c,@@!Y!@sx"#`@oc`] c@@o @s[J c`] c@@e!@sQ` !@sW+]!@@@a +Y-@@[  2- $@@s@@D   Y+@s4!Y@@4!ؠ@@B`]]ahx+@s#!Y@@#!ؠ@@1`]\ahܖ %@s㌀`#Tc`[@@ (Y!@r(`@ 4c@??Y!@r(`]!b@@??Y!@rܒ(]`!Ⰲ!#c ]!!#cޘ ! #c c`! c` !  ]#c@?"@r! #c֘ ]#c3"8"!&!& c&` c<c`c ' @c<  cD ?'c<b` b`! #c B! #c C! #c&88888888ttttt88888888888888888(88888888ttttt88888888888888888(ttttttttttttttttttttttttttttttttH`PtX\pttttttttttttttttttttttttttttttttttttttttttttttttttttttt<XXlXTD|\(DXX8,XX$XXxpXxXXh( @ <XXX\4 XXXXxph`XPH0TLl4XlXT<$ \D,t\T<4lX8 0XXXL㻐!Y"Ēb`@>X $""Ē$@>T  @=@=@= @=`]#`@>bp@=Ð 㿐!"Đ`"Y@>Y!@pŒ-]@pǐ"@>"$"ā㿐!’$ @>\`9cP&`2@` .@= ` (]"@p w]@="`` ]@="ؖ@pcX``0@=]@=}"㿀 [] `GB`I"! $@y  $c` `;] +? !$ @= `"?@p ch@t[@qא!$ @= `"?]@=;#H@p@pޕ c@ue? $`@ @=&# ]"@p `@ $]"@p 㿈 h "] `GF`I"L $@  $(`0`h `  ?c " @t ` @T$`:' ?@p c@T\ 6?`2# ]`#p]#@<@o$`41/ @pn c`@ h"(`@s $ "$@=ư@q>'@<#P' `  ]@<#@ox?$@q&1/Ͳ N`/^`(@<˔ c`, 8``/^`8@< ؐcP֐ ]"@os 㿈  2 '@<ΐ `@ `?'@L' @< `@ `?@N' @<@ @<谤 @ @@ @Ӓ 㿈`]` `G`I"r`$@7  @  `G`I" $@( c` `$`^ $`^`$h ` `?c " $@s  $h `  ?c "` @r`  `` S ``, M`/ ?"H$@D` LL `"` @<2 2頄?` @,`h" @rȐ#' @`m?"$@8$NL@2` `@; %` $`  $`' ?@o, c@p $`"'@p ' ?@o c`@@ EF`@ LMhK@rpF@;[ x]"@nS!4`@G`$@;N H]"@nF!2`@6 $ @rY @rU@r   "8``@rF @rB @s  ]"@n !.]]"@n!/㿈?^` @Mi0?@Mi㿈 H] `G/`I" $@  $c` `(^ ? $` ?@n ch@q@og@n| c@s?`@ ҐӰ@:Ő ]"@m!`@ $]"@m!㿈 H`?T`?  TYc`Sc`Q c`2?@n9 c "w] `G6`I"]$@ $c`+  X^+ 0`h ` ?5c 2@q{``0`$`3 ' ʕ^a(H?@m c` ʹ 0 ^3c@:H!]"@m@!`@``Բ@qN `$` @n'h@q8@:# ؠ]"@m!`@$]"@m!㿀 U] `G<`I"$ $@  $c` `5^ &?^a ^@:^ $` ?@m ch@pݰ@nm@m c@9א!X@l0@r?`@ Őư@9Ő!0]"@l!`@ $]"@l!@9"ƨ'D'P '''`'\"!      ((#``###`PP + c cP(`@9` $"c#@9 # - .] `G`I" $@r  $`ci,`4 $ $`g$P^]!Ȓb@9l"D ''h' N`%c 2Nc` h`^P ^& @9. ]@ %@@9 c cc#'`y'P+``@9  t cP`~ c@l $`$@m@ h@o}@8`^ 'h &@8 Ӻ@ %@@8А @8Ӕ'@@^^aa''' 'l/W'L'H'p't'x'|''X\nN `yv(`c8@@8@%@@nx  $`2 $ P ,c@m@P c`"c`   6(@83 (@8z##c"c@8Y"]"@kQ$`@)@8L!ؠ]"@kD$`@P]"@k>"`'h X%@@8A  %-@` `"@8:]$@k"^@8"H^@8"xD&^^"@k"`@^ a''X"[֚ ^a'``'```'`` '`'h`A,c@  $` ?8l @ |@ 8 __?!H_a8 @888  @ , @?(8( @p``l `?L ^`? @ @`^a'X`` `? 'D;``@ `@.H  c`DH@ `2l`|\ @| 0.\"@@&| _a8H ````"P@'`'\"@' !@ `X %@@7; ~X @-@@ `'k @7" Һ@U %@@7  `2Z``?$@`+`;``/`9@*@ @;`@ ж $@+`;``/`9*@8 l;`` 'l`' @W*``ŀ/W  'l 'H `c``ٚ @ `` + `+  *@ @:@ в3+  @ `*+ 8``$:P ]*#@  $` v@'`$@@2ʲ80`'lâ  `?L@'h^a'X ӛ,c@  $h `  ?lc @mTl`} ( ' c`{r '{'P&]#'@i "^@6 "@i v'h`,c@  $` ? ! ! J !J L# ?_aH??l` __a !H_?a*+? 'd!^%]Ȕ"@6F̀ Ȁ@"'Ȁ@ @`3'Ȁ &@5̀ 'Ȓ#@h^@5"@5`^^c 0@hp`wc`/U㤀`n^c` 'p '|b 'h ,c@  $` |?l` '@ ` @  @ @%@ t` @5m @ %.` -.W*``|.| L #.L`H 0.H` * '. .......H`"#\c\`2#\^@5+ ^@#\@5 %@  @@5ꨒ  `?L'h^a'Xj`U,c@  $ `` `@" @5[(@ ' t`c`/U㢀`^c`$ ('tx`c`/U㠀`^c` 'x@4ɒ@ '@ @ `X %@@4 X @-@@`'@4݀ @4ꨒ ^#В@4#H c\`"`^@4}@'@P@4 ' @4@@'@4|@ '\ #  @.c`D@ H``"ܮ `^D 'Dծ @ c`^ư g@48#]"@g0$`@ g@43 @lUD?8@48 @~?080e @ jP@(`c @ #'`c,@]""@f^@3"@4`^_c (@f@3 ' @3@@'@3@ q'\4`@ `4 @-@ @'  ']"Œ$]"$Հ wȂ@c 'D-]1^ @.H  DH@ `4l`"d\ "@ 0.\#@&d`4W9 -.`l`?L@ `?l@ @^a'X@ \'\"@'   `?@^aX@WN`-+``?@ `2-@ Ơ%@@3D ĺ-@'`' b@3  #\c@3 0@3$ ' @3%@@'@3 @ ['\@k3@@k/?@k+?`  `@@k$ $@2 {'H?H#'d? 'd" { @.D@ H``"6 `@D`'D/  P@(`c @ ;' /P@(`c @ V' $P@}(`c @ '( `' ' P@d(`c @ '?'|'Lc.F 0^.aX ` 8%@@2n @` -@-`'`*``W.]"D$`P +`c @ '@26̨ @2&#@]"@e#`@ 5@2#p]"@e#`@ <5@2 #]"@e#x`@ B5]"$ 0.]"\@d"^@1"@1`^_c (@d"@1 @1 ' @1@@'@1@ ;'\@1ΐ _' @1ϐ@@'@1ʐ@ V'\]"$]"$9@d_ 0@1@d]"@d"^@1"@1`^_c `@d`'H]"@d"^@1"@1`^_c `@dx]b@do$d^@1ob @1|^_c `p @db@1h ' @1i@@'@1d@ r'\]"K$@1M ' @1N@@'@1I@ '\@16 ' @17@@'@12@ '\@1 ' @1 @@'@1@ '\@1 ' @1 @@'@1@ '\]"$y@c^@0ߐ"@0`^_c pr ]"@c˒#_+ ]"#$]"@c#|_  ]"@c#)_ ]"@c#_!]"@c#%_ !8]"@c#_!X]"$]"#@0 B' @0@@'@0@ C'\]"ݒ#]"ْ#]""]"ђ#A@0~> ]"t$*$@ce@0f"`]b@c[$i^@0[b`]"q$]"m$~]"i$]"@cD#6_!]"^$]"Z$]"V$͒# (ŚTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTT0TTTTTTTTTTTTTTTTTxTTTTTTTTTTTTTTTTTTTTT|p|TTTT,TTT\T TT㿐 "8] `G,`I"  $@  $(`0`h `  ?c @f    $`0h"(`@f $@d0`@ Ԑ]"@bw%㿀`  c`@c`E_0.   cP@V&쀢 :  6 "  #\_!   `"  $@a" $@/` $`@cɐ0@/5!Ƞ]"@b-%H`@0 ]"@b$%K_@/$!@b$㿈 `] `GG`I"( $@  $c` `@_ 0?耋 '_b8聪 _聠H @ ?@b chޘ@eٰ@/f?@b c@.ߐ"@a@ci_@g? $`@ @.ǐ!]"@a%c`@ $]"@a%a` "] `G`I"| $@  $(`0`h `  ?c " @e @  `Gހ`I" $@  $` `?%`  -`F_``?`)` Ё z``( 7ʑH' ` 20` #@' J?Ȁ`a/`"`$`"`$_@.A"p]"@a9%`@`$`X`h"(`@e= $ "] `G `I"! $@,  $` ?`?ȁl`H`2`$``8ȁ7`$_@-"]"%@``ȟ@`$?`ޤ  a$`_`$`"@bm@f  $`V?@bcS%`Ё H3])`_@-Ɛ"]"@`%`П@M)``@   `@ #$H' H`P ``(7J'A` h ` @d`_`$`` `@~  ???@-w@-{  ћ,`@  @@-?`?,$@cB  $`^2 $;ȁ H#_`` _@-A#]"@`9%``` `$ȟ@ @-/"@]"@`'%`П@`@a@eN? $`@ ?` @d$   ``0H?Ȁh怈` @d`@c`$`l@ahH' ` @,"]"@_ے%`П@`$@,Ԑ# ]"@_̒%`ԟF_@,#]"Ē%@,#p]"@_%`ȟ@e`]"@_%w]]"@_%x]"@_%]%@_"^@," @,`@, ```@_㻈``@@,@-쀦   2C   `",]` `G䀠`I"`$@r `$c` `` @@ ' ` f " ] `G`I" $@O  $``"N ``HI G `G`I" $@: %``$`(``@,  ]"@_&`@`$(`0`h ` `? c @c` ````$`^ @b"0@ ` @,q, $-]/^;9`7`,@,d`,@(@+ 2,&N@^@+@+` @^hU@bĐP@+ 2,&L@bD@+`g`$`c@`)_`@ g0b@`< @c3`$`@@ hT%@bP@`^@+r ]"@^j&`@p`$@+@+a X]"@^Y&%`@`$@_i `@   h @bV $]"@^@&#]"@^;&+㿈@+애?@^ה c8? ' `Gh`I"X $@+  $c`+  a`+ 0`h `  ? c " @b  + #\#`#d`a( @+  + $`+`%  ????'''Д'?'@u' ?+h@a֐`!a@@_Oր``@ @*!]"@]&r`@ $]]"@]&p@^H c㿈@B  }] `GE`I"3 $@  $c`+  ]`+ 0`h `  ?Pc @a  " $L`2%  $`' ?@^ chӘ@akΰ@^' ?@] c`@ @#(@@*uc@@=@*Ԑ?: `b쀋` (@@*bc@@=  (@@*&!H]"@]&`@ $]"@]&㿀 cP   @PՒ쀢  ˬ    `-`@*  ( 9; ] `G{`I" $@  $`m,`4 $ $`H$ $ `H`@K)  ޤ #)`1;#\,``  !p@^K@  ̀ !p#\c&#\`Ѐ  #\c`!p ޚa@@)0W@^! $ `H`@2 ) c 2#h ` @ " @` @]/ $ @ h`@`v@]  c@]c8 @`$@)0]"@\Q&]&@\H"^@)H"@)V```ax@\>㿀 cP   @O쀢 J F``", `c`` '`#\!`   !pQ`Ѐ  #\c!p D`@a0@5 @)H`0@(!]"@['`@ #\X- @ `@( q    ???k@ $@9@(ђ E???А%@@)؀`?8`?  ,@ ` A?"@ $?,@? `?2ꀦ@(ˤ ƀ@)?ٰ$@؀]"'M@[t^@(t"@(``_a(@[j]"'B$@@^K  $`2 $㿐 n] `GU`I"1 $@[  $c`+  N`+ 0`h `  ? c @_C``bPF $`?0 h՘@_-а@^   `٠ : $ @` @(,@\0`@ @'!Р]"@Z'`@ $]"@Z'㿐 n] `GU`I"1 $@  $c`+  N`+ 0`h `  ? c @^ː``bthΐ $`?0 h՘@^а@^>   `٠ : $ @` @(1,@\0`@ @'}!]"@Zu'`@ $]"@Zo'㿀] `GZ`I"<$@k  @ ] `GS`I"Y $@\ c` $``a` $``P`$` 1? $` '?$` $`@'?@Zϕ ch" @^2Ŵ@[@'?@Z c@[ $@_B?@_>?`@ `@ h@^@&"P]"@Y'`@$@&" ]"@Yܒ'`@ $]"@Y֒']"@Yђ'㿈 G] `G.`I" $@Β  $c` `'` ?@'Z  ?@ZR ch@]@[1@ZF c@^͐ $`@ Ӑ԰@&"]"@Y'`@ $]"@Y'㿈 G] `G.`I" $@~  $c` `'` ?@'   ?@Z ch@]e@Z@Y c@^} $`@ Ӑ԰@&?"]"@Y7'`@ $]"@Y1'㿈31cl!# ` c@_@&Вc'애`bЕ?@Y@`&cl@`#@_m@&c'애`bЕ?@Y㿈5l3`cp.'쀦 ] _] `G9`I"? $@  $c` `9` #cp@'@_$ $`쑠 ?@Yu c!#!@_ΐ &l@`<#̀ @ZQ쑠 ?@Yc c@]߁@`@ Ȑɰhǘ@\°@%"ؠ]"@X(`@ $@& @_B&cp]"@X(  U'p `G(`I" $@  $(`0`h `  ?c " @\ @b;  ' '|  `H0'|   @a  'x ( $@"'t'``4x| 'xc@     'l $-@   (@ #@ `@ ``` +`@ -   @`@[ ' ?@X c ó|"`c@% @%`p`p@ `@% "]@%@l@$@ s, a r, , 'p t, , , ' s`cPH? a@Xu@[f m|"@$Ԑl@$Д l, e n, ,  g h, , , , '`E ? a@XN@[?|F "  *f $@$ A@$$`"f!@Y b!€h"(`@[ $@$ 2](p@Wr^@$r @$ ``c@Wh`cHJ`cHH`@ ؐ?'x't$`"*!0@$WY @[`xt@ +`(`@   @ `''t'x(r]]"@W1(2]"@W((:`@$(# @W(#@X@x ?`#`@WŔ a!#L$@@X@t#L ?@W a$@`@W c08`?''H'D'@`D`@'L'D ''' `G'`I"R $@ $h ` ?c "'@Z 'D`@'D А `G `I" $@ْ  $h `  ?c @Z` ` @` ?" `$`$@` ( `$`$``ch"$@Z`I '`G@E '`$```4`$@W '` `' @ `@# u& ,(```'Ϛ @ @x`c+`1```Ԁ " $ H@ `"L ,`8``\L  š ''`$@`(`@ %%@@#:&@`  '@#5 8.  * H `?@ `?@ "xL`& ,`8`\H.  *L '#@H@  @ f 3``?@^`%@ @_4 ?V '`@ ܖ0`@ h" $@YȐ $@WD ``` ".$ H@ `2.L`m ‚ @ `" + 8`@`(@`$`@ @ .   *   L`&6 `?6'`@ '@"} M]":)``$ H@ `e,`:h  .  :g .  @`#@ @. Z`` @`"&?' c`)`L `& `?`\`? "3.  /.,L `& `?`\`? "Ӡ ?Ϡ :'@Vk . cX@"H  Z`.  &.    dy0qcX@"6  Y? @! '      ???Ѐ@  x؂$?`??@"8`? `?    ? +@[  ? ??Вc`@!  ".L `&2..  3 #`@!ٔ  2L  '?I ?'' :m  .  `&28 f?&% @` @d`@!} 8@.  8 .@!v`&'`'` @T`$7`$`$`3: @ 0`@ @ " `1`)@!Q  ?]]")@T,^@!,"@!:```ch@T"@UZ& @@U @@!]]"@T)]]"@T)]);@S"^@ "@!```ch@S])I@S"^@ "@ ```chx@Sۖ@T c?c̔  c̔     ????? @?`?`?`?` ?' `G`I"b$@  @ "] `G`I" $@  $(`0`h `  ?c @W @Vl  $`u`@?x`?`?`?` ?$x''x`*  ` H@`g `?`G `? ? r  &F  $`"s $0'h" @WU` U`c  `cЁ H#`$ޒ@T  $`"L $@TH $`cȁ ,@'`cЁ H`@ #@R$@T`@ Z\`@ aah"`(`@W[ $c@X`@X$]]"@R*4]"@Rے*6`6 $㿈@27  @ . 6` `@% c?@Sg6  @ @?@S] c㿀`]` `G`I"`$@  @ ] `G`I" $@ #c` `$``` $``a`$` o@? $` e?c`"C`$a`聪 ~ {aW聨 H aP Jaa@] x]"@RU*`@aaa@F ]"@R>*`@`$`& $`@ @ @b P h" @V/z@WL?@WH?@S0@S $`@@ bc`@ ijhh#@V ca@ 8]"@Q*`@0x@ ]"@Qے*`@R`$@֐#ؠ]"@QΒ*`@A $]"@QȒ*]"@QÒ*㿀`]` `G`I"`$@  @ ] `G`I" $@ #c` `$``a $``a`$` o@? $` e?c`"C`$ab(聪 ~ {ad聨 H a] Jaa@j!]"@Qb*`@ab0a@S!]"@QK+`@`$`& $`@ @ @X ] h" @U<z@VY?@VU?@R0@R $`@@ bc`@ ijhh#@Uca@!h]"@P*`@0x@!8]"@P*`@R`$@!]"@Pے*`@A $]"@PՒ*]"@PВ*㿀`]` `G`I"l`$@͒  @ ] `G`I" $@ #c` `$``a $``a`$` T@? $` J?c`",`$ac聪 l iaq聨 H aj J3`$a@w"ؠ]"@Po+$`@`$`+ $`@ @@ h" @Td@U?@U}?@Qؐ@ @@ j@Q̐ $`@@ tu`@ {|hz#@T5ua@"]"@P+"`@0@"h]"@P+`@d`$@"8]"@O+`@S $]"@O+]"@O+㿀`]` `G`I"l`$@  @ ] `G`I" $@ݒ #c` `$``a $``a`$` T@? $` J?c`",`$ac聪 l ia聨 H a J3`$a@#]"@O+H`@`$`+ $`@ @@ h" @S@T?@T?@P@ @@ @P $`@@ tu`@ {|hz#@STua@>#p]"@O6+F`@0@.#@]"@O&+@`@d`$@!#]"@O+>`@S $]"@O+:]"@O+;㿀`]` `G`I"l`$@   @ ] `G`I" $@ #c` `$``a $``b`$` T@? $` J?c`",`$b`聪 l ib聨 H b J3`$b@ ]"@N+l`@`$`+ $`@ @@ Áh" @R@S?@S?@P@ @@ @P  $`@@ tu`@ {|hz#@Rsub@] H]"@NU+j`@0@M ]"@NE+d`@d`$@@#]"@N8+b`@S $]"@N2+^]"@N-+_㿈 z] `G@`I". $@*  $3c`` ``Zb` )?耋` c`baX :b聨 H b@l: :` hؚ@QӰ@O{c@S? $`@ °@ِ!(]"@Mђ+`@@A: :`@Ɛ ]"@M+`@0@ Ƞ]"@M+`@ $]"@M+㿈N`0ba`.N`0 @L !.*V+`*``4*8`bap'쑢H애 J  @ ⁠*N `x `?`X`? "N`**+ "Ё*NЀ`6(`c@ *8`(`;`bah'쑢H애 J 䲆*8`Ƀ*8`Ёrrrrrrrrrrqqqqqqqrrrrrrqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrr㿈 D] `G3`I" $@  $+`0```` ?耋`@M ch@Pc\@L   $` @R $@N_@Mt c`@ ΐϰ ? $]"@L+㿐 e  "\] `GD`I"; $@  $(`0`h `  ?c b@Pba   - ]0`@ 8`, @`@~ ?$],9@Ls"b@s"@Lsh"ʃ(`@P} $`@ @?] $`" @M]"@LS,%㿐  `G]`I"T $@P $h ` ?kc h @PB   `e  "w] `GA`I"d $@-  $(`0`h `  ?c @P    + @`$`-  $`3@@Oh"$@O`@ 0`@ $@`$`װ@MaԀ    ` c@MT@Đ@O]h"(`@O $]]"@K,X]"@K,`㿈   `G`I" $@ $h ` ?c  @O  @  `G`I" $@ $h ` ?c  @O  `@ ؚ `G`I" $@l `$` i@?@bb@ 7Qȁ@' `` S  "] `Gg`I" $@H  $(`0`h `  ?c @O9    X @Ԗ$`Z$`\  $`]@ @Nh"i$@OdH' @ ``  c@P" ?`@ L0G`@ e0``@ 0z`@ h"S$@NN@|$`@LM$`" @LG ' E @L?@@NHh"M`$@NHh"j(`@Ne $]]"@J,]]"@J,]]"@J,]"@J,㿐c    `GY`I"P $@ $h ` ?]c  @Ns ` `2`  # "_] `G:`I"L $@[  $(`0`h `  ?c @NL @`$`#  $`"@,@Mœh"$@N3`@ 0`@ Ɛ@Kހ  @K@ @Mh"(`@N $]]"@I,]"@I,㿐@b #p@@S㿐@b #p@@S㿐@b #p@@S2  +  *@  @2 +   @ +@@ "@ 2 +   @ (@+@"@ "@ "` "` "`  "` "` "` "`" "" " " " " "  +  8  " 㿐#a`` a. @@    @aa  @ & a@ @ 6@ $ *`$a``@. #`   a#a a+a 㿐a`‚``` 0@y@u㿐!!`!`D 3  a\ 6 #!``@U   $&a\&a\&a\$!`㿈#a(!`%? @Ra(D@^!$ $  $\!$( @@$!$$($\!$K@'‚`  ‚`  ‚`  ‚`  ‚`  ‚`  ‚`  ‚`  ‚`  W‚`  ‚`   `? `?@㾰  )!(`#+ ` " 2;a$@` $a( 'a$a``?`r(`b|@a3` `@h.a`#!0‚`` #a,7a$ "a(Ő! a,ad܃0```@  a0!  a,! -bʃ3` ``@`!0`@%a$!(@@ ??"ݒ K@?Ѐ`  @(`8`Ѓ*@ @@ К`퀣@ a n¢` ~ W `@  _`? " 7 {a w! a,!na j! a,y!aa` !,aa V!#a,e!M`b`d!(#a`@";`UU a0ad63``@3`!0`,!  a,;! #a`a0`!  a,+! a3` ``@4 @?"4! a,#a0!a0` ``@a4`#a4  a0! a,!a ! a,!- !(`"!``a$H@`)! @T!(`a$H@`|ݚ!h!(`a$H@Ѐ` ad3``@`!0`! a,!a ! a,!a ! a,!a {!#a,#!0!p`b #a0B!(`d`b`8}a$a$@!(`'a$%!( ^b'¶`50 [ \!(`y!b`8a$a$@!(`'a$-g%!(`!b`8a$a$@!(` ]W'a$ \%!(!(`%b`8a$a$ @!(`?a@'a$%!( ]9 ]`"0a ! a, !!(`b¤ @   a0Őaa"a 'a$Ȁ]@A# ?@<#@P !(a$`u!(bc`o  c,`d@ !(@ @Xa$ 2`  "  `D!(`!b`8a$a$@!(`'a$4%!(a [/( - /*@  ]/)/+/,/- @p( a] @// @ 2  `2 $`2 x @# ?@#@O} !( a$!(a$`!( X!b`8Pa$a$@!(`'a$%!(@d]@ ߚ?@@OS@#@OM% a0' a0a Ēa!b@r# Ԛ?@m#@O2`؀`V`b`8Na$a$!(@%!(` 'a$'*!(a$a$K@`\2K``)@ K@`}@ 2@c@8 @ 0`  @ %!(`($8` "`/a$a$@!(`?'a$ G%!($8`#a$a$@!(`?'a$ <%!(8+`@ @@$8!(`2 b!b@# a?@#@N b!(a$!(a$@# "9?@#@N`a$K@`\K``|b@Ր#@N ,'8$<@ \b@Ő#@N!(`,`b`$a$a$@!(`'a$%!( }b@#@Nt<8#a0a `l!  a,@! ? a,;?@ "O K@`,2J `@ "K@?Ѐ` A @(`8``Ѓ*`@ @@ К`@}@a$'a$@x@!( @` %!(!b@m# r@h#@N-`/a$a$@!(`'a$%!(!#a,#!0!%!(a$@M# "?@H#@N #a`0``4@ &a  @ @ 6@ @ @ $ 4*`] ,$ ,a`0@  `+ `, `0D @1b$`$`$`$`,$`$$`$` $`$`$`($` @#   ^     %@ [- \>@#`-^?`]`@& @6`,$``a`*#@ %$``]٠! a,!a`@֐#a\`H?̠ [0a`#@b `@& $`@6`ޓ,$``$``*@K @C$@# ] \i@#2 ` $` / $` `@& `@6`-$```* #@ @6`/ $``a`*#@ ~$`@ @ u`]@ @ k`]@ L@`@ @6`g-$``*` @ @Ր 0@͐`@ @6`O/ $```*#@7$`@3$!(a$!b@# q?@ #@L`!b@# e?@#@Là` "!(a$!(`۠` "`(a$a$!(a$@!(`?'a$%!(' ?'$<`#a$a$@!(`?'a$ %!(<+`@ @@$<!(`2 b!b@# "?@#@L b!(a$#!,Q? "   `la\a$!(@ #@ 'a$%!(@7 `]`k!(a$!b@# ?@#@LR̂`؂ :`? .`?  =  +!(`a$ @` @'a$%a(  4/P (`!(` @_#@L$!(K@`]퀣 !( (`?a$ a( @(``8``]'a$@D#@L :=`?.`? 2B 1?!(a$a`b@+#!<`W8@6Ub@#@KN!b@# x?@#@K֠` " a,?@#%@@l`@h`? a,@P=!.2?`2`, $`( `,`@ ` @@6@`(.`$`(`,``((`#@$`,ˠ?2`$ $`  `$`@ ` @6` .$` `$`` (`#@$`$?#a,P?a`Pbc@  [bc@ [`ha'P7T@] $`  ` @ + @6` .$` `+ ` @  $`t?`@& `@6,`$``` [*" +`" $`                           4<                d                         \P  d 0                       㿐b`+#a``$@ ! @ @ 6@ $ $*` ($ (!S Eaa`a\`(+   a`@ `?` @`"@ a``@ a @ @ 6@ $ *` $ a +``? @ # *b @a``#`ax`#axaax @ &# 0``((` #axa0(`+`(# 㿐a. ` @ a a ~`0  $@? 㿐 ¤`ر. # a` L@ ` a @a  ((`@@  㿐@7!!t@  @ @)%! !t@  @ 㿐!!ta V$!t !! !ta p+ata@ a  @ daba`a^a\aZaXaVaTaRaarܐ!+at>` /%tat>`}! J`)`!<`M#%8`D  !<W!  8!< J!!  !<%atat>`̀! 0Datb`%at!!``  4+~at|! !``%att!8p! %%atT atab@ L#@I%atT!R!P! 0㿐 a$? a, #a( a0#a a4 @   @ "< @ Jc`@   ?c@  :c  @ @ b #a@D a`#a\"D# # # # # a`"*cN!$!t ax !t" c@  (@H 8!  ``0`@ Q  "Ɛ @ ˒ 2  @ ǐ @H0ِ! `& 㿐 ` @.&@@  ` @4.#㿀`  @@ .@*$ @.@" '쀧@'&`@.' '&' `@?0 @' 㿐& ` 2 ``X@ @(`&`'``#` @  @ D@ +`+ &(`&`'``#  @ 4  @ >+ .&`' #  @ 40*(`& ``/ #` @' `Ԙ $ +`.&`' #` @ 4 㿐@ @ `    @. @ @ @  `<1 `8,@2 2 J @2 J @2   @, @`  @@  , 2ְ 0`@ &`8@ (`"@$`@*``8$`8.  @(`$`* `8$ @ʒ``8@(` `8@+` `8@(``8@+``8@ ` `` `  $`<@,  (`` @`a2 `8@ ?(``8@  +`` 4@`<`b$`< A` @,2  @19 9    "`8`8@ `+``8@ `2`@@ (`` @"`#  2`8Ԁ @    2`8̀ 퀤 "`8  2`82ǀ ŀ 2`8ဤ2`82`8򀤠x`* ``  *`$``@ *`  *` ` , @   !@ "S`!O!"N`4L`' `'' '`'܀  * ?  *(` `0 $ *@~` *(`b@`'*`D `` ؃,  @'?ؐ(``D  `@, ? ` 40& & `" ` `  *`'`'`'`'`'@ exh` & H^* ' Z* ' V* ' (` @N* ' J* ' (` Ĩ@B*  `  -$ @- 0* '   & D , -`(`ad@a`?' %'@ ?%% && D$ -$@ ` 4 ,  -@   !`? !!-$- DՐ D`䀣@ & 4 '` ؃-'`'ܐ@-䀢 ׬ ` `0` `0@ 2  ɂ '`'1 -` D*`@ +` @ &+` @$ ,` @ 6 D,`*`$ D*`@ `@ճ-` a k i'? '%a'@@ '@%?` ?`"'? '?N?'+`'@ 0 -` D*`@ +` @ &+` @$ ,` @ 6 D,`*`0$ D*`@ A`ճ-`?`"@ '?`%?` '?? *`$# D(`?`+  @-`$  `+ % & @& <ڐ & 8 ̐@@@@@@@8?bȝ``??c\X@ @"" #` ` `9 @`@ `_`? ```$ @9! `%?خǐ.  @`8. @ ``C P@T#@@ @<8@##@. @-`  ? %T(`` @ "!>`? `"' ? @@:`~ `8?<*@``@а `2* !?#%`,* #`H%` ?`8``  ` ``` `3``0`3 @  2 4?c`*  `    ?c   –`٪ @ ``_@ `? -```& 9! (`&?c\@ @@ ?ccHcD@ @#? ?c4c0,@@9#@ @"?#H-`# @x`1 c`D `H x-@+` `` cLc`Px@(`, @ @ %`%Ȓx@(``D `@4xx@ؚ‚b`(!`H?#H?cX @`#@ ?? c``( -+` `-`H`-?š` b?`X`? `?@"#,`8`` cc T`XcP-`@ %@ `%m`8`@-?#,! A  ?cH@@`` ?c`` `0` `0@   4?#0?   -@ #-?cD@@  `Ӧ ǐ?c4@#@? `ٞ@  -&   8:@`!  _@ +  `@ `?@+  +   &ܞ?#, ?#,#?c0@@` ?c0@#@?c4@@` ?c4@ @?\`@ ? @ ߠ@?c\@`@@  !?-```&-```&??# ?cT@@` ?P`8@ H` `  ??#9 ! `8?cP@?@T@ H` `$`@?c  8 ؛-@  @ " ?cP@?@T@ H` ``?c  8 -  +@" ?cP@?@T@ H` ``?c  8 -@  @ " ?c `  `@`"??\  t*@?@ c@`<9?"#Lc@? @#@  c?#\` R (`` @ c @c? -`8@  @ # `  ?< ?,@?@ cc  `8`D  (@ +@`# #   ?<x?+  @ @ ?L `  "?c\@@ 2,`8??+`#Ȓ 혐?#`Z* ?#8 #8#8?#\" ?#\?T#?c8@@" `?c8@#@* @@ ??cؐ!@e ?``߀`$* $ `8K& ?c   5??cD@@  '@#=:`* ?#8?c\@#8@+` ?c\@@`?c\@ @?8?8"?#@ ?#@V#??H`۬ ?#  `` ` 0` `@   4??X ["!?#@#@㿐`Pc. `L` ,`T@``\@`@4,&`P . `%@&`P+```. `8# K` ` ``%@(`H` ```"%@`#%@(`H` `w``@%@(`H` `y``"%@`#%@(`H` `_``@%@(`H` `g```#C$ `L,@ @ *  @ &`L@ @ 6@ *``:`X `L&`X&`T*`3`\&`\`L*`.``&```L*`)`d`L@ &`d`T`\, #@ @#қ, (`@`d#@ %@?+ *`8$@ @ ``"`T`\``t` @`\ @`LZ@`r``@ۤ`T @`L @㿐 L@)@ @(`& L` X  L& X& T*` \& \ L*` `& ` L*` d L & d \ T, #@ #㿐  #@ `2! 2&.` T@ ` `6 \ap  (`@`  &(`@ ah. a @ Ѣ @ 2 _" .`"(` 8H` @ @ `` *@  "(`H` @ @@*@  (+` 8`@@+` , ad`? `   ` ,` @@ސ ` @,`)!lp@@ǔ( $`  ,`@@!l@@( @@ i` $@4  ,` #,` (@@!l@@( (@@ N` ,뀠@a`I  @ t_t  `'X'l'd'\ X`,` @ '` @ 'h@~ `h@w  @,`     ,` @`,``?   a`@  㿀.`#@+` 8@`꒑*  8``q 9  aZ`@d,`  '(` @a'?ad @ah. @ ,   a @< !`%  @ 2  _"  8H` @ @ ``/@ 䀋"  H` @ @@/@ %@`@0?,%@ 8!`@ɂ %@㿀!!l"ad@   '' *`&T@*` @ (` 8 Q.` 8%(` ``>  `@5,  `,@(` D`` %(``(`.@ @ '`' 8`(` D`@`@ϖ`?@ @@0%(` 8``"!l @  8x.`#@+` 8@ `  al%   ,`@@`@,``?`?@" ܀ "`@R'T* 'ؚ39!l @ @ ;ah(`@@ `?0'[ @@g'ܔ  @A,``@<؃,`@" 2`ܙ*`# (` 8`,`@(` D``  " (``+`.` @ @ '`'2ܗ*`" (` 8`+` D ``@" ؂"!l @ ah(`@@ `?ː' @@&'@m`g&܁㿀``a 'P'T'X/ #`’`ٖ  `_@ `? `?*  @ "  (` #`L`9 `T.b`  `خ` `X,`,`5!3/,` @(``8@` Z` '' `ap  al&h*`!d}'ǐ`T,`쀦80``?@ BT`\,`@ <T(```@  2uX `  ` ,`(`-  ^ (`,`  2Ѐ`/'(`,` 80``?@ 2`\T@ `?@?瀣@H8L `Kk`T `ap  al&h*`!d*@!d@h ?@ `?P@ @G `d- C@z` ,` @(``8@K` @ X#@ `0xT@`#@ `( @ad@ah~ & ap"al癐 7&d, 甐 9'!D $h `'!D ` ` ` `` %     d(@h? @ @@ !Dh@ F 8hd(@ ?@d(@h, #@%`L%`P H  %`X%`T B`L%`\`LM* %```LI* %`d '`T@1ad@.ah0N@@ @(`8`#d+@ ah@㿐 &  && &  & & & & & b`   & $& (& 4& 0 0& ,& l& H& L& h& X& \& d& `㿐@@ b`^ <`   8@@` 8@```@` <@4 8@ 8   , D `7,@ D L  T,@ ` \@ `|4 T X  \  d } ` u h  @ @ 2 0w@ ɀ@ ( 0`<   ,@` E` =` 5` -`$`  ` , @n@  `$@4` ` 5`,`  `(, @]@  `,@4`(`(   0@ɦ0@M ,c <@I`$@E`@A`@=` @9 L@4 0@0`,@, h@( `@$| d@ t \㿐`  @ ` @`@@ @ @ @0@c 㿐@Ր @  N`2  `L㿐 `   @&`,``㿐 I ǐ A.@`    0. `2 `  ,``". "`@ . && `2.@x   & ` @w 㿐`?`?@ @`  @L@@` ,`@`   (@+@+a㿀 cx* '@4  '` 9 aa` ``,`&` ` ` ` ' @ ,`&@ $ @ $ @  ``A$  `> `: "9K*(@+@` @ ,'` + @! "~@?!!@!? ? !  !`? !r``'耠@ ت`K``` ,`   ``@6,`@G!! _ ! ƀ? @@8@ %@`J`"` `H@`,` H@`2D`` H@`2``(@`p` %`` J`"*` J@` *` (@?``` (@+@+` ``(`+`*@`   %@쀠@` @2 24` `K` J@2 +`K`"+J@"`+@`@ @ %` KJ?@?`@ &K (@ "@ $ @"`h$ 9'`h $ *  @ *  `* @`?`?@@  %@`Y'`M +` @`?`?@@ǐ  |% (``$ 8`@  L`L@  J "?`@8  @t  2+` @(``8` Q5ѐ@ɶ.`2@`'(`@`2@@@%@ǒ "ڠ Ң`L@ "€@J Z %` } N` @N@%@@\@`2` 6` %`z쀠@w`  @+@(쀤`',``@ \ X'㿐'@ @ @"@ 9c  #$@ Đ& & & & &  $`.  @ @` @g.@ǐ `@6 ǀ㿐c`Sa` c`\c`Yc `Gc`I"q$@| $(`0`h ` ?c "@0@g! "wc @`"~c` `GD`I"``$@| `$(`0`h ` `?c @0y@C` "ac$``$`"f0 c`c c@R @,>@-ݐV@-ِ`$`@ `@@ h(`@0Bc3a@+ c @,# >`@kh(`@0,c x@, F M@, c@ @@, c x@, P U@+ c@ @ܠ@+`Ȁ cN` c @+ ic@!0@+ ’`ٔ+ <``?_ @ @ @ `2: ``?@ *c (`` ߐ (@` `M `` `Jc`c0l, c @+ }c!@@+c n@+ c@!ȓ<`@+  ('c@@`@ @ t.@ "]c @6#'c@x,`$@n`@ #cȀ 5$c $cȚb *$ 4 $4 $  #$$cȂ J" c `"2" " M" 0H@=!Xc @+5 x`@0;@+@+Πc @+# tc" @+ c"0 @+ c@"h@%`ccb@+ c @+ c@"h@`ccb@*㿐@p7`$ V @ @  @ ›.`c  `T" `F`H`?`?   㿐Ӡ "T  `F`I`H2 c2"0c @* c"I @z 0!@ c @* c# @* c#(@@*`c @* c@#hT @*  c<`#c< `? `?@㿐@| !€ , ` "c0@ $ aȂ  ` `2$` a@"$"@+ ` a@*"c W@*:#c@:#@H`ccc@*0  @:@`:``:``:`` :` `$d2`$  `㿐% *. @` )$)!`6#'$c@:`: `: `: ` , :  " @ cȐ`2@*gᐣ. @`ـ c j@)ߐ#c@ߐ#@`dc`@)Ֆ`%!㿐a `.  $0`$ ` ` 㿐%@ $h `  ?c '@-' ᤚ? # b)+%#a@:`: `: `: ` :  ᤀ  @, @+@#Ȑ`2@)aà`$!!@+ #ac0@ $`!Ђ`2 $$@*&$  `㿐#a`.!#a@ a@#a@! !@Xa *$a!@f @V!#`@*@cȀ <#c@Ba耢 @;"  $!"$a @H"#@))!c! @)#c@#@(`dd` @)ac @)#c@#@`dd` @("!"  " ?" `" @ I$" 2 $㿐'v`@ $` c@$ pa \%@,``m  WU)+-%c@:`: `: `: ` :   B @? , @*>@cȐ`2@)! DB)+-%c@:`: `: `: ` :   / @, , @*@cȐ`2@(@-@a%b$dc (c@!Ec#@(c!Jd@c 8@(c `x+``@a\  ??? 8@`  ``0¤"$@ @1 ? ( $@@ 2>``N  $@@ @ @2S ]&@c `ѤL `? `? H  :L `? `? 2  "  "@ (@   @@؂ `?8`? 2  ?`?`?@" $@@&@2| 㿐 8@` a@ \\ `@ ,8:7,@L `? `? C  :),@L `? `? 2  " L @  @  "  L @  @  ,@&@ @@@&@ $ @",@ р 㿐 8@` a@ \G `: ,2,@:/,@L` `?` `? 2 :",@L` @ ` @   L` @ ` @ 2  $ @Ӡ ,@ &@ @@@&@x 8@` a@ \C``2  ???$@؀  @ @"-&@@  8`??`?@  `?`?@ @۠@    @ @2 &@x-`@a\  ??? 8@` Y ``2G @9 @(`=`,@ؤ`3L=`@" $@@ `?8`?  ? `?`?@" L@ $@" ,@ ,@&@L@2  `  @ ,@&@㿐 8@` a@ \")!. @ $@@.  !@`2 &@"&@&@㿈 ɀ`9 `1;b?C c,@ $h  `  ?c b@)b` 1!ƃ,` @$h ` # @" @) `b@ǐ?88` @Ɛ )-b @ 1 ,`@%@ @ ``b@``ה`b@ @(|  b@D ,`@` "8cȀ #c `$d2@a@<`< `< `< ` < ` $  $``"   $``@ 4 $< $ @&@ $ @# @` `b@  @&@   @' ``&@  `%@ ;b@6`aa@ 'b aƒ,``@ `1[) @ ! "#@ #\aaa`! @` `@ !Ȁ@ i$c@"Ȣ@-L @ G@-K <`< `< `< ` <  $4 $ $ @&d@ $ @}#dc Xc@ v @)`@%8B @`%!@ a " @ #\aaaА#aȟ` a?'bdc (c@ }t%bc @$#c@#@`dd`x@$㿈 @'a $`2 $' ?@% c "㿀 D  `GҀ`I"D $@te  $(`0`h `  ?c " @(V @ޒ  `H' ` `($` `  "#d `G`I" $@t0  $`da@$ c0h"(`@(# $ `"& aĂc``2 c0@ $h  `  ?c @'/a  "d `G`I"^ $@s  $(`0`h `  ?c " @' `TcÀ``Sa` $`b`4$$`a`$`c`4`$`$`c!#\'b @#' ?@$; c@% @%`@ ..h"(`@' $h[`@'V $` ` H@À` a\c€`bab@--$`@$$`@$`$`@$`$`@$Ր0@$Ґ `@ \\@$0`@   d3a@( c#@# #Y`@d$dc @##3c#@##7d@ @#c @# #Qc @##DaĚc `?㿐!#<`@@& #<@@&@g{㿀`` !!`#% 'c0@ ` " @$[!c0@! $` `2 $$@$N@ $` `2 $% $ à -/c0@! $h $# `  ?c @&c`"  c` #%Sa`2` d3a@{! c#@"s$ `@` (c`db%Ā`"` `)'O`Ăb@ a%!$` `8d!O0``28c€`b‚a` `%`H@` `\ʂa\ %#P!'@+)@+!%!$u$@"%j@"X$Ăb@da$a\ %`H@ a\ da@`@` +`(@ ` " @` %` ``e )!#@-Ăc@^ )/@ΐ!P@!fb@ɐ  @)$@ @) ``%!ab#@_%@+S@+Q!$%!K$a a+$# '79/7$# `   @)c`$` @)^ ``%!a8#@`]'/` a'7'ᜁ㿈c`SaԀ`~ c```cH@ $c( #aĀ   ?c -@%Z-` p/ @a 9c+7d| &L@@ %| Y@:*` $r#L@ 2` -f $%`@ ``TL  JH,#@L@ 2` æ` ,@ ?dd `!a0Gd3a@!Рc#@ #`@x א#|@*` |@ޑ*  %c#@ Ȓ#c@Ȑ#`##@ @@ ##@ #c@#`@|dda@ *cc?#c  @ 㿐@~ /  ?㿐  @@n?Sc`-Pa؀`2`a܀``<@  @ "`8`Xtr$`L`XP`8:4g`<T Pa؀`"뚒]`<d3c@B" "`d@?b0    `ٚ @ `"`+  1!ܛ(`@; @ @ &!ܠ  +  5!@ `0a`<@  @ 2`X`8%!`X`<`  2`G   ''/#/$`@ۮ@ۋ? h@{?e@v ?e@| e@l ?e@r e@b Ӓ'Ee!@ g"Ђ 8g#c"@b82 $ p# !g`z  a,<``p<`"@ @J+` 8`(c@(`$@6 "gg Δ &`@d&@ @ e&` &`s@` @  g@$bh I&``&`@@ `$} @y @9#`@$`n !@ 'g #!ؒ'@ g#@e,{@ !f@ٓ!P@١`ggchx@ !@ 'g#!ؒ'@ zg#@b!gf&@h쏔"f"쉖(c- e'@ _!g@_ g@ ]!@ U'9g# @l g!+'X!@ G'Ch !ǒ'@!@ >'>h @!';㿀 f'䀠`  Ab(`c,@ h@ ` h`@`<e` `G`I"`$@\  `$/㌀`+``h+`0`h ` `?c @`eL@  @e"K@ !h@ @ ㌀`2t ,8``/e7  _ `` `C"} @  2  @ޒ 2 }_@ " ` @2 ㌀@ @ @ h g  `2$ `2$`+` `%`(`c@`@@ vwhu@pha8^! ha@Z ha@V haHR  , 0r 1,haP@ؤ ,h@\!Xe!@ T"P`@p @ 0S@E e!@ ="E`@3`$c@w  Y7L``tUec`@k  "LK7g`@ bh $H`h`baha%`?2'@@@ @'@:P2'P& @& " ` & @  `#  ` `& &  "gc  "L@ `2$ `2$`造`'€`k`f* ffchc H䀠`& e"@ !f@׹ @ fch@耢 e@ ,?"$e& @쀢?eg꼖 & @ `e!@ "h!@׉`@ח@ s@ׯ#@g@ےbh & @פfgbꊔ` &2&@` `8$N`fe!@ V#h!@U`/ eec@׌  e!@ A"h!@K ( "e @E  "qe@H  (@?&& & & & & `#`"& & }#"`"@ @J``@ ? h@h&  `& $@: `0aecؐ@6 h 1e"?@ !h@"0@M @ e#8@ ޒ"Cee#8@ ؒ"@Ԑ!e!@ ̒"u` @ ! "@ !f@!P@` hhbXh@ "@ !f@֮!P@ּ`hhbXp@  (e!@ "h"x!@ (Mh "!ؒ(z@ g"@@֍@֜`!@ (vh"@ָ ?*e@׾쀢 e@֮耢?e@֩쀢?2'ge!ؒ(o`, @ ( !@ Z#h"!@ T(mgǐ#!@ N(jg#@!@ H"h#gg"b@א `` @(b {d{}}||TwXwTzzz(y㿀' 'h-/h)+  27'+ {H'䀢 gK]" "U `G"'`@ @ @   $`2 $`!$" hLcX줒  @N@ n@ Ĕ  $`2 $`$@ "`%&P" a`$H`$$QÀb``%"%b`2P?"P@aP@ H ch-cȒc㿐@` &@ @@;(`@՗& &3@@Ռ & &)@j"@q"Xj@q"`@`jjb@f*j"@]"Xj@]"`@k`jjb@S +` `# 㿐j@G"!"@Շj@?"Hc" @}j@5#0@֛j@0#X@֖j@+#x@֑j@&#@֌j@!#@ևj@#@ւj@#@}k@ @xk@  @sk@ X@nk@ x@ik@ @dk@ @_k@ @Zk@ @Uk@! @Pk@!H@Kk@!`@Fk@ې!@Ak@֐!@<k@ѐ!@7k@̐!@2k@ǐ"@-k@"(@(k@Խ"@#k@Ը# @@` ` cP@"k @ԓ@Ԧ# @Դ`@~ 㿐k@ԙ#@'l @ԓ!@#Pl@Ԏ!@#P@ސ#P#P `   k@Ԃ# @Ԑ`@Z @c㿐 H |D l|G"P)#4%@$`0 -  (! = @`@  r@V@ :  $``,`2 $&,?#4 `" #l  =@ 2,۠(#l @ ҐbXrU @&bX  @ ĐbXcrʔ @!@  &c   H{ l"`{'@?$<' l? @ "p r< a@&i @ ! r<l  @ Ӑ"x@&' l? @ |" r< a@@&' l? @ j" rq< a@m@Ը&' l? @ X" r_< a@[@ԩ&' l? @ F" rM< a@I@&' l? @ 4" r;< a@7@Ի&' l? @ "" r)< a@%&!i @ "ؒ r<q 1"i" @ T -¢ &@ )Ƥ+l`b@d,`#@ ?@W@  q<@ aĢ&#  <0Ԓ @S%#<㿈`'cP` @ = ~,@ `@ `J L` ”`ك+` ` @  8``_=`J` @ @  $!`#`j2 $$` b#`Yi {A G `G4`@ .@s쀠`1$` =,U`?*8``_`E c` =l@ǐ"j"X@$;`@ =,@Km @D쀠`$@Ѐ``' l@ҥ"!b@#`#`R b@ @ Ɛ#lc(@  $j$8@"Xl@҅#0@㿐 ?`j$h@t"Xl@t#X@C@3j"X@i$bl@i#x@ilj#X@c$mll'D'Hc'D@Q#Ѐ    cll@H#؀ +i  c`b@Ð b@ b@ҽ b@Һ @ӥ!l### #  #  #  #  #  #  #  #  $# $ (# ( ,l# ,c(@Қ b@җ bl `c@ΐ#@}#!!@% !@" !@ Ho@;'bH @DsH-m`@7  D`%D`mm``'H'P'L X%mH@Β c   `m>13&#&c 'iDH0袘 ?/%``v &# ,``@` cc`%@҆ c`&m`S %&cDH0u ?բc|`2R!%`"#m` - `0 c\%`c`2mc`7t`t @ #€?!$`Ā  @s* ƀ . c@`Ā?$$`Ē  @Db |2 $)9m I% #8" @:ic``` `@ a`y y`@`` @` ``2` `ll"P|bٶ'  &/T.  `c0  `Gl` @g@@L@`t"lL`@ @ %&@  T@T!"쀈`"쀈`!@$#P@   cX``%b D HHx mx '$@#8@{ c ow@@ΐ@  $`2 $&@@ ' ?@b c o^@,`@д@  $``2 $&@@ ' ?@G a xm Gmxp w c(lc(@ ~d c` @o@Ђ 0bc@#`Հ`S@   cP%(`H@ "@  `ٚ @ ` * @ `*`2"(``$ #` `S@r/T` b `ScP bK`2m@* @`Sb   ctm @\t`Sc`m!"J`r @ `f@ 2mJ`rJ `[`S%`V$b  N cpK`K`SH `m@!8H@b@'#`;`Sb  3#cmah@Ґ mc'#`/T` b- `S@ @`w w`@``{ @@` y` @H` @7@L@`tL``c`2m`` ,@ `X  #` ݀`S( m@\`   "7m@s!@Pb7@g X c `$m@a!ؠj"X@Y!`@@T!@1J"@N j"X@F!_`@2!@t#P╒ ?"j@l#`⍒ ?Cj"X@."#m" @_#@‒ ?3"j"X@ "m"H@@-`@"`zcl `@ %@~ a bD@  @H+`@ #` `$@ap G`S C#c%$L @!xj"X@ڒ#0`@@@cc`L c`%#`cc8`c`cm@κ"pj"X@"J`@c`@[`c\`b !'㠀` $#hc8`c`cc s!$#dꥐDD` !㠀` t#`t $#t`gcp`^cl`e#@Wk (`H@@`#b$#c@\ h@9m@U"@2c` j"X$@Em&"m  #`@·"@Α#`@j"X$j$@0"Xj@0"`@>``mmb@%*"X@"!m# @I&$#d$#dv`c8@dcww#x(0Z @I$#hb'@| ZT@(t\(㿐@Ր#P!mbc@@Ϳ#`#c`%c8mm@m#P@ͯ#`mc`c@ͪ#`%`c$@#` `$#`$#`` ((@`"``mch@͐#`mcx@͋#`@Ϋ#`@ζ#` @ζ#`@͎#`cH@|#`m@͊ (․`㿐m'H'L'P'T'X#H㿐m'H'L'P'T'X@#H㿐m'H'L'P'T'X@ #H c#cĝ㿐m'H'L'P'T'X@#qH@ݐ 㿐` .c`2 H@N`03  N `"NN`0( N `x`?`X`? ²`ك.8`e`?E`?   @`  N`  㿐 mm`I#c#@ $@+@ mm`#Вc# @̮  $@̶@̨  $+@6 $& & 㿐@̑/! $#Ȓ @̟/#Ȃ/x@  (&@&?m!k#m@k#@y`nn`(a/&?#$#ȁ㿈cȐ`?@#c I" :2 $㿐 $ ``( `2" cȀ ;#c> >  >  >  >  ${` 6 $& `I)& `S" $`S c@F`$ `"  & @  Q&  @   +@vȰ $`"k  & @  %&  @   (@  $#"X (`& @  ;&   @*  $@ +`  @ 6 $ 4 $@m!"Đ#m@Đ#@` nn`8@m!0#m@˯#@˽` nn`8Pm!(#m@˛#@˩` *nn`8`㿐nm  pc !? $` $ 66 $@˚ $6 $ 㿐 . $`*+ 0``d `S`" `6 $& 6 $c&& #c 6 $ `6 $@^ @Z 0㿐`cH@ $@?`  x . a@ cΚS ` +@@`@"ꀦ xn@ 〦 xn3 @  xv ?К @J /f 7c`*` $@`0dc?@$@^?c`Sc̀`< c`O x@‚` K@ @ J$@ K@ ` @ ``*` J$@ K@ ` @ -$@+ ) ' % # ! ` ؒ֒n3c@ʦ m#"W`@$@n@ʕ!r x (TTTTTTTTT TTTTTTTTTTTTTTTTTTTTTTTtTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTtTTTTTTTTTTTTTT(TTTT TT($)c`   ‚ `@ _*˜` @ `   @ `2 c`2 $ ‚ `@ 2c`* $` 6 $ @$@c`'c`"}$$ @,@@,>`' @ ` ,@`2 $耠@*$ $` 6 $8``+ `?`-`? L `i `?`I`? i *8``n `?`N`? L `a `?`A`? ~L `n `?`N`? t $`"``6 $``6 $@ђ쀤Q !>(p)8``02 $L `x `?`X`? "v $`  "$U $` >6 $' ‚ `@ "ف(* 8` $'  ` 6 $>L `n `?`N`? *L `f `?`F`? 2 $*S`*`nL `i `?`I`?  aL`-2 !aa@.3`*8a@8aЁ㿐``&` 3!|@ƺ#@@#* @@(`#@+ " +`@*# +` @ @ $ .#$`@ # `, 0``"`"ϰa$ *"``"`"cݰ㿐/#``D 2)  Ā@1 c-+| Ā@) ĥ,`c `$@[@c* @(`#@+ " +`@*# +` @ @ <$$ Ā@ݥ,` `+`ถ +   `#`  @ d`@_`@㿐!` ?#?]? `$ "Ę`(`@ #`,"` $N&@`#@ ;`+`@ @ #?!  `  $ "Ę`(`@ #`,i"` "/&@ `#@ ;`+`@ @ $&@    #`"$   `  $ " `  ?$ "n#`@Ғa 㿐 @Š@ %+`*?#?n,`'``"( 1 +nan@ a@  `$$- @`$%``#`@pđ*  ``#@ ;`+`@ @ #?n,`'``"( Ӕ +@ń'ڠă(`@#`,p%'Ԣ`    ???S`Ȁ`n`@)  nԀ1`| `?@a$@``?`?@"JJ`\nJ ^`? $`?   .@ 'Բ``Y @ @ Ӱ&.@@ "n @ & @! & X!``!!!@ $!& @ *`!@q @ 5!&@@# @ +@& Pa`F6 @؂ `?8`?  ?`?`?@"԰    'H`?Ѐ`I8  \(``P@ \.@`.@ `'!+@3`@r"X@ U0a(@ `$!&  ,Z  y6 c`܂ \.@` b.@Ԩ dc`".@c`2.@‚`ٖ  x 3` ``?@" .@n"p@  \.@`.@`EԒ ."hn@."@<`nnb$ n "hn@"@)`nnb! D "hn@ "@`nnbn"h n"nn"h m6 @ʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈʈ`㿈7 `  @ & V @ @  ```?`?@ %? "V   @8u ` 耠`  '  , š, +@& 㿐@&  $  (  T ` ,@_j@[@YT @U (㿐n"h3!&n4#㿐 #š `@R   V ` `6 (`8`` 46  ` `@ "0   "n `G}`I" $@F  $(`0`h `  ?c  $`\`4 $ $`P& `V  ` @& & 29   "n `G_`I"i $@Eْ  $(`0`h `  ?c  7 $`H`4 $ $`&7~ K~V `Pnn# bh@¼!2G %L $`@ h"(`} $@:,  $`"' # `@ $ $h"(`r $ $n"hX!Gn"hS!5㿐c1` bc1``&!cx ` !b&!@ !!ށ1`M `` S``  @ @ : J@` ` 㿐 : $#N@`Ѐ  *N$@@@"`? 㿐" !nN@͐#8  2N  o-cȒa\ `? `?@㿐@ @ @.[&@&<.X`\&``X0``.Y`X7  &D&.Z&P&H @ 4@ $  , (@ @  P @  (@  &" 0" ,㿐 ``$ [  @`  +  `&  [`" & 4  "@  & & 4 @.`瀢 @B  @.`   [`&  0 @ 4@$ ,x   $     P'''''' $@1  (@ @@?68`?`?@<,    # ?,   #& C& 0 (@ @@   P@  +@ *?` `@     @ 6 @2Ȓ& & & & & & $ (@ @ P'` & & & & & & $@'& 0& ,㿐 @ 4@$ ,@ ` (@`@6& 0 (@  P @ @` @r ,`@&& 0 & 0& ,0 @ 4@ , Z`@ P`" \@ 0 %      $ P'''''耢 K' (@ @@ `_@. " @&@؀ @ \`v ,``@ # @ @?,``@ #@6& 0      $ P%'''''耢 '  `  (@ @@ * @    6 @2@ `8`?`?@ (@  P`@ (@ \`,`  @ ?``& & & & & & $@ \`,` @,` @@ "`@  ,``D@6O& 0  ( @` %@g W% (@      $  ''''''@@5 `@g "2@_@?؀ @ɔ,``@ @ # ?,``@ #@& (& 0& , & & & & & & $& 0@  (@ؐ (@ @@+ , @,` `@ @ & 0?"p @ 4 = \`2  ` +`"`@  . \ @q,`   #"@?@ (`@ @`"@ #  @%@ D@& @ H@& H 4@  Ъ @>(` & 7 8`?`?@? (@ @ +@,`  @ t`& & & & & g& $ @   @ & & & & & & $X& 0㿐`8 @@6 ``.`  @6` T(``3@ `5 ` " ]0    .`" ^`  ]`  `   L @?` `@  _怦  H (@,Z ` "T ` 0@p \`Ԕ? `2& L [ 2>  , 0 @#@& ,& 0 ` @ H " @& ""@& (& H& @ X` & 8  [`2 X& ,& 8 , ",  @* [`/ P`"& 8& 8 @ H& & & & & & $@? `` < D [& @& H& L`& ,& (& 0. \& `h , `& , Y?`' ($ @ 8 ?@ * (  @``2 @@ : @ ( 0@@#'  @ @      $''''''@@Y `@ `?@ @@& @$@'& , ^`A "  ] & L , $ [F& 0`   ,  6  0`@ 8`,` @4@` @&`& L  @`? " <,`@"|  < D @#@@@& @& H` . \,`@,@1  ,``,`M,`#@`& ,`   ?*@ #  @ , @ H ,& 0 ` [@@Հπ ,"@ [ (@@  P`& 0@ 2`(` T `3@ ` ` " ] & L @ H [`  & ,>& 8/N& L%, *@R  ,"@M , 0#@ @& 0`& ,   @ @*$  ,@   ` @ H@  P`B @???@\؂%`??  @ " "& & & & & & $& ,'?2 ^ (`?"'& & & & & & $  < D @#@@@& @& H. \@'    @ @+   ?+`` # [ "& 0  @ , , [& 0@d   _ & L㿐@ @  [` @㿐.`` $ $ $ $@}$ ` $  㿐 & &@p &   " && 㿐`& ``+`@\& &   ``@]* & && && 㿐```@    @;  `i@5,  { ` $$@ ?`** @ 06$*`@ @:? #@ $@+C.`, @ *L @  ?`*,* @ +@  +@ 4+ " ," ,*@  "+ (` +`" .`,㿐 C :  @0`@ @ 4 `0 &@* $ Y     2 ``,  `# $&``@,`. , # f`  `"$``$$"`4`$ ,".@ @]*` @$$$ ,,`@ @N*  @㿐```@ ~  @@ @   d@@ڒ  m $$` a?@ 88 `, 8 "+.` @ "<&?8 +` $.`, @@``@@@4 @ $+.`  (` +`" .`  (` +` "+8Ȗ8@ȓ(` ,  @ȕ* $``㿐`  `@   @ `& 9 /` 2`@  @*``@"`*`*`"  `$ *`@@4" "    &@}*`  ?$  @%  㿐  @  ` + #@ $   (`` &@    ?$  @Q  `? `?@2  `@ ,   `*@@ *  `  ` * 0`+  @ &   *@  ` @ @  "  *` `" ` @ *`㿐   C@ @*#@ `@ #` (`@`?+#`` (``' `"   +` w@ #   +`?"   @  (`#@@# #  @ @  (`#@@# #  `^&  \`$ݘ ښ @U? ";@*` L? `B&@,   "6@,   "+@@*`  "@@*``?`?@$`?`?@2?& & & & &  @  Ȁ @ 瀠@ ڢ@ ͤ@ ? 㿐`&@` > ` , ` *`@ ` `,  D@@@+`    @ $@  (``$"  `瀢   `@.    $ $ @ǒ  㿐@ @ $ ( @@`@  (@  @  0@ ,@㿐  +    `D@@@+`` @ @  ` @ 8, @  40`@ ( @0 8@w   p `X <`4(@ .@ $`4$`(U >cP,+`@@`3 c 3 `?`?@2`43 0`@ `@+`@ =9 ;$`4 "#`(@9  "$  2$  @" $ @" 2$X4 `) &%@$`4@& @C $`(ے`4@@ $`4 ) @> %   %㿐}  +    `D@@@+`` @ @  ` @ 8,   @ @0^ 8@  D   N$ (. >c%)#@*  @(`@`3`"-3` 40`3` @ `@+`   $ 4`0`c ܛ* d   %@$ 4c"  4&   @ %@b b p\` ` 0a ~ `? `?  `` /` ,`@` 瀤 @`. @"`\```4` 0\@Y@* @ ``2$@ `d" $@ , `@ ,`$''''''Ԓ@@8`  @-   `4 ` `.@` *  `@ `  ` `"d \`$    4 @k8`?    @" `.@p  * `y ؤ  9 @" \`4 @$i`, @???@7ؠ ? ؐ`.@D*@@@$?ؚ .@49* @2 `` $`" 0 @!   @ & @Ԓ@?S  P. 㿐  !@ $۔ ( $@ $ ,@ $ 0@  @ &  㿐 . ob8o@ "@8@@9  @?0@@:(㿐 8@3  & @& 8& 4@* & 㿐@  `2      @ `㿐 `"  `2 ` @ `"   @ ` ``" `+````(`@"`  P+@ @ " P` ```"``` @` (`*#   P(@ +@" P 㿈`耠```''&` &`?   ``` &`&`  `` `"```2 ```` #`#`` `` # `" 㿐```  (``p@``p`` ,  n" p `@@n%```cpp P`@@c%o0\``` , #``T`* Ȑ@0M`X @ $`X``2` ````"`` 4`*p@(`` @#@@ &     & " " "``* @`" " & "p h`@@%Ԃpp x`@@ %ɀ88h㿈.`@@'`'ސ?* c* ?!.@ `@@#```     @ #   #@ 0`@ c@+`@ "㿐,` `{@(` ````(`@ ` * : @ 0`3 @4  : @ 0`3 @*?3 *@ c@2 ??X * @ O 0i??*  :(` @` a?. * @~ I ,` `@(`  ,`@@ `@?  @. #@[ $ (``@"  ` 2Đ@`?@    ,`. "  7  p@(``@``S  `?@.#  `` "h``9@`+ ``2   (``-  (`` :Д `6' ' 'آВd(``@` `,` @Ԃڒ`?@`(`@#`& && 4 @   ђ0'(``## #  `@``"`@+` `0` ` @㿈`H`8@ 4` .    @ y& .``4!`8 `\2 . ```6` `"   +` }@ & `s8 (`cT@`,@߃+``@?ۢ  .  d& |  _2 ޚ `8 `@@ $. n `8`(`@@ ˚ _2 ǚ "] "Y  . 2S  "O  . "I "E  .  `P `8`L6 `@ H`   @ 2. ?  . 2&  !  . 2    . "  . "  .  `8``@@ &`8<`8 ``t&`8  &.  `[`€`` .. ``` – `  ` @ _`?  + }@ & ـ`V8ư (`a@2  2  .  " 2  . " 2  . 2  . 2 !& .  2  @& 2  !. 2} "& 2v  q 2m  &ؚ 2e  &К 2] Ϛ &. 2U  P 2L  . 2E  & 2=  . `8``(`@@~   `_"  +` }@ & ^  $`\+`` : `,@  `"3``\ *` @ `(@@ @ `2#`#`tttttttttT4tL$PtTHx㿐t`8@&`8`H`8@ 4` * k @ *```4`8 `\`[,`]"( >`^`-D  * S `,@+``@? `\造`[ `8``@  "`8`@  * *6 * `8 `@@ ``:  `:`=`.!  **   Ȃ  * `@ `*   * *    * ** *㿐 @#䀣` 8+```$ @ `& & & + +@?& & & `& &@2 &0 @   8"$ 8$ @㿈/͖㿐`0``@   `(`P@0@ `<   ߐ  ٖ  Ж ʖ `?`?@`?`?@?$`$`#  @ @ $`@ @ $ $ 㿈``'````"``  &` " &`"㿐c?͔`1@ ``?,`? (`?/  @ ?:@ ? @ @  ??Ѓ. @@@ Ѐ@4?`@?㿈%     $@"@`@#` `@     $@  `    @ `Ӣ  㿐@'@% @# ?@ @ @ 0c`L㿐`   P,@   .    @``  @`   @` @` @`` @` @` @` * @ @ @ @ ! @ o <c@@ @,@ *0@  D @(`` ,` @ `@㿐 "  &@& & @ & 㿈```$`8`,@  `(`   @(`  `` `$^`8+``@ $ `8@ "`8 `8@"`8`?`? 2 `Hp\$, `H@  ``"`8` @`H@- @"` (@t `2`8 `[`2& `\`8` @`"`8@`]2 "`8 +@`"0  ``2U  $P `@ 2K  $`"`8`8`,.`" `.` `(@ @ @ "```"`8$@@ `( @ `"`8`2$쀠` 0` @  `(`   @(` "`8 㿐@p`@ Opp`@ Hp$@@ @P$(` #@ `p&$`@z p ”`ٺ  7`(``@ * ``@ @ &@ `7`? `@^ p ”`ٺ  7`(``@ * ` `@ @ &@ `7`# ``@@  p`@9 -p ”`ٺ  7`(``@ * ``@ @ &@ `7` ”`ٺ  7`(``@ * ``@ @ &@ `7` `@ p u”`ٺ  7`(``@ * ``@ @ &@ `7`Ͱ `@ p ”`ٺ  7`(``@ * ``@ @ &@ `7` `@А p U–`ٺ  7`(``@ * `W`@ @ &@ `7` `@ Sp ;–`ٺ  7`(``@ * ``@ @ &@ `7`y  `@/` p & & `ٺ  @ `" ` 0`+ `@ *@&@ ``$@ X @: 〢 `ٺ  @ `" ` 0`+ `@ *@&@ ``$@ > `@] (p   u7``(`` / @ @ &@ ` 0#e " ` 0`+ `@ /@&@ `` 0`@1 -p ”`ٺ  7`(``@ * ``@ @ &@ `7` `ٺ  @ `" ` 0`+ `@ *@&@ ``$@  `@ -p –`ٺ  7`(``@ * ``@ @ &@ `7`Ű `ٺ  @ `" ` 0`+ `@ *@&@ ``$@  @ϒ`   –`ٺ  ` 7`(``O@ * ``@ @ &@ `ٺ  O@ `6 ` 0`+ `@ *@&@ ``$O@  `ٺ  @ ` " ` 0`+ `@ *@&@ ``$@ j `ٺ  @ `" ` 0`+ `@ *@&@ ``$@ U `ٺ  @ `W" ` 0`+ `@ *@&@ ``$@ @ `ٺ  @ `" ` 0`+ `@ *@&@ ``$@ + `ٺ  @ `" ` 0`+ `@ *@&@ ``$@  `ٺ  @ `" ` 0`+ `@ *@&@ ``$@  㿀 '@  (@ܒ `?`?@g 2X`k `*`  8`0`+ `* @*`$ " \ +  8  $ \`  < * @ $ /'    \`X @ /$X '  0 @ $`@ǐ '@ @'@ `$9@(`c@  ] "*  \`E H 8@ @ ,@<+` @?8ǔ  @h `?`?@ߦ '@V @ `    .      `?`? f '' b 8 `? ` `s@`  `8 b   `@`’ `?`?@2}   "u `@` @@ `?@| @  ` `?``? _  `?`? 2" +@ T   P@ % P ~ J L X `% Lb% X  o <  \`W X@ R% X`  &` ݐ`  ֒ @@ "q  't'p@8  (@4 `?`?@  'lN'h `ܦ`"  `# h#\' 2'@` @ `@  'h`π`" 8`8p(`c@2K X`?`? 뀢v  &  &  ې `?`?@J`!pp`? P@@ `?@ؐ /  `?`? 20F?L ? ``"%?`?`? -8@ @  @ " '@Ò `#pp`? 8'@`,2ݤ?פa 8 b 2u` '@ `Ґ `, '@ PpΚ '@``h 8@& 8l`"  \ +  8  $  \`$   < * @ $ `2 X `2 X `2 X `2 X` $`2 X ` X@ % X /'    + `z   + @)@@ " @    0``+ +@ @$  @ @"@`(`" ' 3 *   +@ @ w$ 3``@% X`٠    `@ _`? "``+ @ "``  ``     T+@@ % T   " "`0 @ '  'l`$ 8@& 8+ '@@pq  '@a  '@ @$_ `?`?@ޠ`@@q6p `@@q,@& 8`׀`  8 @& 8 ..  /#\'ܔ 2'@u \` `?`? ؀ ․    ??x ?@ `@   @ @  䀠 @  @ @  `8`?8`? q 'x'x@ i ` t` @ @ ``+`"`#%`     S 'x@ 4 @ 4 4 +   -@ @ $  &o  & /' b   2 '@7 & 8&&.  }@ `}@@s䀢 i   '@ `@q- "֐ 'o J /'  Ā `  @ 怢 ` `@N,`` "@G,``?`?@Ő 't%`%`a`  @ @ '@ '@   '@@܀   `4 5 ސ1 @x ` @  $<    + . @9?-<@@ @ ?`?@ `X@$X`   ( % %`0%`,@`p&`k%%\`2XX@  `'\X0``*2(4`2$4   *` `` (``@L;` @ X+ 0`@+ (`@ $\$X4` ` @ *``@ $H *'XL`Xd  ,h*```" ,X2 $$ 4`ؒ$($0$,@(h '\\  0~ *+` `` "  @2 ΂@ @ (`@`ɒ 2ä@@*`@ 筐 dJ `& `@ s*`"{L @v  `"+``@:nL*` ```J `6 ``{#`@rڞ  ` "ג``@`Ғ`^4  + `V  + Ē` 0``2 `L`"`L`X`&``L`" `@@* &`   `    `"  ` ` ` `  $ `  ``` , @@  `* @?נ ``@, `   ʂ QX$( KX$,XE (`$0,` X^ J `825XJ D`C`4%  & @    %% @  Q0PPQlPQ8NQ0PPPPQ@㿐쀎b@@b$$ $ @! $ 2 #"$ ? @@!6`+ (`@$ $ @̐  P @+@ @ $ 㿐b2 `+`+@ @@ &\  * ob81o@ "@@ `` `@`@"` 㿐w` 㿐  ;(@9@& &`&@ &` /@& &`&@&`㿐 `)  ,@ `  ,`@@l @j`@,@c``` @] @4 & |@T`@R`0& |& "" " " " " " x @(&@`@$ ,`@````o܀ '&@@!܀ `@,` 㿐 4@ N . t 2 4 X`  ``*  ` P`"  *`@`   & t Z 㿐 hΐ`2  d  ` @   ( + @(``3`3``c````" `` `2 ` ` " `"ܘ @ 㿐` 2`.@` ``6`2`J H @`@C2c"@ x h`` "8 `` 22 ` $ `,  ") 0'`3 @(` 3@ ` ۳2 `` `ӳ2 d``2 ̀c  ݀` d``@" 2㿐pp&`!a%Z@E@ , @@ &@.@+@,  @@(`  ' '  '  㿐 `   @` @@ ``@ @  㿐 4@  x ,@ &@ @@,  &@, *   t@@ & x㿀@@(`   ?' ` ,`@9, @ ` "4`(`@`` @?`  `y `q 2`k "`*@ D '`4  ,`@ K `D?c,`@r @n㿐 | "`7`@?`/ @(``@&  . @`(`@`?㿐@ d(` @. / @ (`+@)?#6`,@ ,` ``"``` 2`" @2H " @2@?6`=`ق@@ @(`H@`, @  0@`  @`@?׀ `ʀ܂  (@4  H@`ؠ `? 㿐.`@(` @`@?@` @@  `? `?@ @ o㿐 d>:``% ,`@*`@  (`+`@ Ő`@ `@, 㿐` d `,`@, ``" `4`9 `8` P0@ `"`  @"  *` @ $ (` `` ` (` #`& `ڀ  @ @0*` & &   @Ւ  㿐` `?.@. `@ @ .?㿐(``@ɐ .. `@ @ .?(` ```2ق``  2  ?   㿀0` 6``! `, @@(` ? `@4`@`&`&@&`  I @h d? -@(` @ H@`l <   @  @ @3(` t@+`` @   T# ݐ'̒␐̀2 @ @G t @@A t@`Ă ̀ "H@0<@@+``@ `  ৐'̔ZԐ@̂@@ `"'  '0 @̀ 2'̐ '́x.`@```` ,@   (`2   @ &(` `2   @"' @`2 @5@   `8 2 `8@  @ Ӱ ``ϰ  @@` ဎ 2Ű  Q  ``\.@  .` @N`.` $` .` @@: ?` $@.`   ??'? آ.` @ ' @ '@# ` @.` `xu rp  $`  `@ 4 @ `X @@S````@@ J@ ` ```? `` @  =  @9  @ 65  ``?F`@ &) ```? `` @    ```? `` @   ӂ   ``? `` @ ǚ X 'H@ d@.H'X'Ā 'T'4 H "H t 8''& t& 8?ܲ h-  ` `40``2 ?'耥 `X`40`` 䀠`޸♒  t- $ X n  `j-  t@``'䀤`0  `?' ` d! ,`  .@`h2m'@ʔ " `. @ ࣐ ` @,`@Y؂ `'䀠` \ '̐\ z' h?0̒5  t- $ `` X @@@#X* t@   H#@& 8 & tT   ޛ` Z'0  (` . t@`%'ԬВ`ߦ I'Ȓ) ⱒ t 8 @"o. @  6w`@z В`߂ D'@J̐5\ '06 8'̒\ '0Ȁ`ɀ@KȀ`"m t0ւ ` "@(` H`", @ `*@ H`" t0@) 횒 H#` 㿈 #\ q | @? $  + @ (` @ @W + @ (`" |+`@ (` ` |+`@ (` ` |+`@ (` `  |+ @ (` (`@?&@  0` & |&  4@@&@) `* @˒    | (`+` * & *@  @ | &  @@*`昒 * | @ ͐ `` d'H`' 8#'ԗ/`'Ԙ @ 'H *@ا/ @```0`# h  Ԁ  Ԁ  Ԁ " | |' d N?* @(` @ @m K@`2  b _ .  (`@2( - @ `#   ,4  @@ 2@   0 4=  @0`@@4 $@`$ t ,@$ @K@K?  t,`@`2|``@$ 4  ' |ЀЂ*@@ (`+`К`'Ѐ R` @@@`@2``  @`@ @ ؠ(`$@? h t@ , `@ ```(< 'ܖؔ t @@ t@`܀`2  |@ `@4R |К`'Ѐ `H`Ԙ @ ''  ?`  $@ `@g f$ #\Ԛ i s @U@  @N  M"" + ` @ $ AJ` M'ܒ F' |= 9 Hr 5  / U d t#@y @$ J     `@G,  $$ @  `\`0@?܁㿀`8`x@`d `t,  @&`xL`3I`t, @`2`(#@ (\& 5 `8`h `t @ٴ@L'''Ϥ % 40``"  %`t@㿀` [`  @ `$^ ,@`  @~ t,@`B'``` d8 -` , @`h2H d@ ""@` " , @c  " ``& , @`ߚ `@͛-  @; 4@ @p/ܬ?2 ` i @`+`@@ "  ` , @  ` `2`@M @B P t.@`' d` ``@ @`  t@ 43``2v d 7'̒̀  ```ڻ '``"` ' - + @ (`Ě `@&`4  a'Ȓ޵@  @0V@& (`` @ $, @*` ``  @ Ͱ4D? `'Ѐ . @'(``' '`s `-@`, @ ` @`2@ (`@ '+ N`d@2N  @ `T , @` @&N@,`@ "N # "N 2NЀ`''ܐۄ @^Т ``" @   @? @ Ѐ`@ '0@ `@y`y ' ` , @ @ *`@ ڲ @??? "  , @+  ```  @"  @"     2 & , @@@+`ۅ    耤 ? ߀``@``` `'''''''$ "J'mj h  '''  H.  '?'@l ^@p '̃(``t@+ @ ?`,?̀ / @`3 `d` "n@ =`d ``2`h u0``"@ ֒? / @``%`lȒ?* `t@ `ø`` 2 '`?@`%'``p@2`d` *    *X̔* @`@ (` ?#`& `@ (` @ }3 `   x `̦2   \?`? `R, @u  ?RC@@0`(```#@wu"`̒@@@ $?2N ٽ ?@(`@`+ `t@ 5   @Y 0 'ت 0c `@V  `@``@9%@`@@(`"$ @1`$ @` 2Ւ?`0̔͸@$` ׳ "?@@ @@ @ @ *`@` ?`@%`%`@@ 㽨 'H'D'L'T\  @ 3 @   D`X'p @ D&@@' 't'tDt`&@ $`| ( x,t0`p``` ```>D"'TT`\ 'T `'|L` `D \ @@  L` 4 HLў˒ `'X3` `/`H\ `[`$`\`L $`0$`, D `'/'L?'ĺd`', @T* '@Q܀`M'쀢   $`$`$` `8X0``" '* @7  't d  @?T`:`T''' 2'T  @\``? 'l'x`2  pD  `?0`@  T80`@p@ @ @ 'x@      @1x?`*(`c @    H'|"@ @ L@  \@ N `<@ '@  @  @"@  @L`"q@H @ 'H @ H@`"`@L@ H@ p @H@`d l` T``@v'''Ѐ'h`dh $@ `8 4?`''d'`'\ ?i`h e (d`t "`4L- `#`43``w3``H`8@ ?h``4@'X`,@$`@`40``2``8`$`8` @``, "!`0 (``t`Һ `X`43``"`83``2`8| '` 'd 'h`H@ 4Ǧ`h`\@@#@`pD`3```?'Ā`  2*L` 3`*@ 'D3```?`  @ "LX`L`Ļ, `@Ԑ   L`"@ʐ ` @ؐ~@ `@`?, `t, @`"?`40``"?ʔԬ@H @ p @@'H p@ K@ "`߀@@ L@  H @ p  @H@`'퀢@ ``2̀``8 2E`8`8K`H -`.`2 `t`>|d ;h`8`x  *`t@ ` $`8  `?`?@2`8 h @2   @,`t$`t$`p$`l  @%@#  S@ '@@0I  20` ( 's'h7d ) "@ ꀠ`~, `\| Д '`'d` f' ¬ `43``q3`Ր h'  vߐ@ @ 0耣@6b`4 \' pp! a@$mװ @"l'\j `d u-``  ,@ `h0``#`8z`h   "`  2`  "` " "`q`8 2`8``ʀ`@@$`X .', @ `t - @@ +` 6@ HԈ ( '`h?3H8`t  @@4P`t@`2` "` 'ܚ `t `8`h ڂ (`@d@ 'H'L'P ` gpp! a@$77 `4  ?+ `  ` $ `""D0```?`  @  X`DL`4 DN`  `d B@@@""   t  ?.`` `#@ t`݀`ۘ  +  @ `(`+  @ `#  (``@` #  `@ + 0’ "*`H| (`" *"`d'T@h '< 'P  ???? ,'`,'`0'@'0'4u4+` ' @ T+` ',`0`0`'(` #(`" (`( 4 '4 0`+  `(?*@#? P  d'''''' ''  (` T\` <.T `` ?2 @ #?@`"  " (  T \`  <.T  ``? @ (@ #?@ `"  0 +< @ (`@ '''(`.@* @   ?@ #>@ `2*  ` 0' '0 2r @*#@ @ # # # # #  # #     @<*  u0h'0@@    @(@ +@"" ` "4 0(`@" Ԙ # # # # # # # ؗ."  """" """ 10 '0'  @ ӈ $ 20, 3  +`@  0@ `ua@d' " '''''' ''  0  <`@0  ?'8@<8`   @!'`,`"i 4@L@@ 8 <@8  @< ' 0 '888Q  '@ґ*  'L8+ L@@'D   8'H?0?? N?(<'`'< `,  T(` @ @@*`@ h8 ' 耠@T8Ԣ .L # 4`H @LD".@@  *@ $` 8'P`2  @#! t'`,   ( T. @'$3@2@  d 8 {, @dm8 @" E'`0 '   (. w 2@ @   @` @@  $``@ h, H#@ @   ` @@  , L *"H@  dT8 H #@L@T\` 'PT8 D \#@`Y.0`L0, D@ P #(@ #(@L@@ 8  <@8  @<`, `~' eLT\`)< *@@ %@T`@`{'`q m' *@ #` ?@ T?@ T``@ `{'`,b"Q'`T.T@ @  `@ #@f`.T `?+@#?@v`,`b2,'ZTH̝㿀\6  @ Ӱ?@ŀ`&  3 3  ``  `r3 3 `3 ``  @, ?#d#\#` R?@  0```Q`pp!8a@ "@ `p  6*@*" @`"  ?*"" *  `++`@ 0`%  ?``"8@@@pp!pa@є!` @@0P`3 7 @  ">@/` "3@/` * Ț $$$p!Xa@" @0% @m `j g /`@{$@x$ 2$ ?&@ Ѐ @ Š㿈d7 4 h@S ,?@V@Q h`#`#\\ 0`#`#\\ @40?㿀'h㿀\`#`#d #h#\㿈#\#`Ś㿈 #\#` 㿀?0  @ `0`#`#d#\#`@ `0`#`#\#`#d#㿐@;  &@ &` &` &`  &` &` &` &` &` 㿐>   a۪@`>   aڦa@ @52  @@- %@+ @ 2 +`@ $$@$%< :  @ $+`@@ `@&@ @ @ @ `& (`@ (`#@`& +`@ +` @ @'(`@0  @@r 7`" @gl''      @ d 2 @! " @@(`@+`@@p@ a@ `?`;4 ; F'''''u@@'@c 2? 耣`@ ```!+` @ (`@ (`"?'@@ j@@'?"Ȁ@&`% `<" @ @'@  Jܕ 'paș JpaБL' J 'Lpa LJ L' Jpapa聪)/?& && & & & & & & ^ pa?????'',a$,b㿐"`1c`- #" @ƒ &r@@b !r@:b `٤`    `" `@@,㿐r"# d. ra@@b@b㿐-``@$.   |@ @ @@`@"`, `@@$,@ ``2@ 0 r"ْ!ar@ِ"@r-cȒch;`r`c؃28`@" ` H42 H H H H#㿈?葠J' J?耠` `? ҁ@*rc rc㿐%r @ (`b @   @$ ,`@ ` @* 0r#b@&@ $ $ $㿐`$``6`$$H  $`` `$`" $` p $`@`$`@"+`@Hy  t 0s2`$_`$+`0`h `  ?c "`$+`$h ` `?c "  `?` `?" @C   ``" `` !` ` J@J@ "    "0@` "0 $  ?????????KT逢 ?㿐1!耣`s+`@ (`!@`` `` 0r b@ǔ&g!㿐+a耣`Ds+`@ )(`!@``  c` '`H$$$ $Ȁ4 $@ `G` $$ $Ȁ4 $a+ @ +`!@ ` ?0$@wa+ @ !(`@ #`r b@v&ya? a㿈`2&@ `*" $`Hr`F`T", `\1(`b@ച G&& bV c(`  !s`@^#`@k#`sr ( `G€`G `H`F sച G## rsr !cD@`b&@bB`b&@cHȀ`b$&@#`!"@LͰ`~c|&@c0ǀ`v`tt&@`@`naXl&@`B`fbd&@!"?1 @@' H3? 3@"? D a$ `B`D@&@ "." %24 "s `Gڀ`I" $@   $%``@s` @'`````"€```&@@ @ @a ` s@C r";'`@0c @ @ `@ s@( r" 'p`@ 0#`!"@LMͰ`c&@r"(s@ bڀ`a&@€``C`&@c,A`a&@bA`a&@`B`bh&@cW``&@ːxŐ#% V"?`g a$`J"?`[ a$`>G`ې= $`@ '("Ȓ!s@!!h@ H'r') @ `"s `$@x!@q' @`$r'gh"s@h!hh "Ȓ!r `'r'W"s@W!Wpppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppppp0PpÀl,L Č 'D' 'D`"#"c DDD` R "c`"#+`7b@c`D` `GsD` `F @ǐ!r"#k`@D "s `G`I" $@ '`o  $`j70f`@ h0'D'`R `@'DDDP``  c#c@"@ ) sD@`D@ t@ DDt``& `'΀`b`Z"xc`#Tbr`"sc`c`xr"># s"@==DZ% 0DZ 0DT 0b`c`#Tbp`sc`c`"Kr""sԐ"`ch`cd`r"#:sŐ"ch`ccd`",r"#/s"D@   cD@ "Ss `G3`I"G $@ ' $` @ $` c"@ @D@ @ D`@ D@ rs #["x"x' ' ' ' ' ' ' ' ' $' (' ,'`D"'@ @ @Ȑ"x  s`@ @ x"x `," ` ` ` ` ` ` ` ` `$ `( "x"x' ' ' ' ' ' ' ' ' $' (' ,'D`` "F@D'0@p"x  T Us7@``2 ``@ &  0DD@"`ذ DD@#`Ѱ "x"x' ' ' ' ' ' ' ' ' $' (' ,'`D"'@'"x  ( )s`@ @ x"x `," ` ` ` ` ` ` ` ` `$ `(~ "x"x' ' ' ' ' ' ' ' ' $' (' ,'D'"@`#"  ' `G܀`I" $@ `@''`'`@>'` `.7@` `P$h  ` `? c u1@D 0 2    82  ' $``@|"x  D`'`'D`` 'c`'Œ '`` ```'@"*  ''@ H`+` 7)s'r`4 $$@"@" % $``D'` @`'`i "@`?'`'@`C!" ` #aa@ (`!@  b * #"x"x' ' ' ' ' ' ' ' ' $' (' ,'" #D`` ``"!`GM"D``@`CD``'D''@*@(`+`  H ` @@"x   sW@`'@ x `," ` ` ` ` ` ` ` ` `$ `("xc`` s@"r" "```ð 0$`Y @ @ `'@"x@'' 쀢 `'퀢 `sr ؒ"D``  Rsr ʒ"aW0뀢 Csr "v`@ $$`@ ͐r !3 r #mh0h0@6sr "*@!ؠr"{#`@ +4br@u"8r"m"`@ J4bpa`"  !`a耠`  !耠` 0 sa`"  !`a耠`  !耠` 0D`` 0 s$` 0`$` "bx#bx#"" " " " " " " " " $" (" , @& sr "H $a@ 0 ;$" r"Ȓ&7s@#@ @`a@sscpؗ*@ !"@ϒ r ɒ"Ԃ@@$a@ѓ*`  $" r"Ӓ&< s '0s `Gk`I"c $@ '`$`R c<"@ɒ "xђ r"#-sX#r #Rsr !a`"  !`a耠`  !耠`>r"j#8s-#r"c"s@c#@@q`stc $`2 $#c"L@"@n9 )@n5"@`  >"v"@l H"㿈'D' '#!D`$c$#DDD` R $#`$c+`Lc@b܀` D?`D7b@m 0qD/0m'D'쀣`g%-1D@` D```,'`D`l`耠`I```&"`'쀠`:耠`@'DDP`D` $#`$cD`0D`#vb  @lq P!"D`@$""܂v$"b  @la XDj` Ȑ v `b  @lQ0D`%u  @lF!#D`b `@K$b!v  @l7 hD``Z   @l- hD``6 v  @l" Xb܂$bD)@ v `  D~`'u  @l!!D`" `@q$""܂v$"ܐ p  @kD`` '` `*~` @mv  @k XD@G v `  D>`vb  @kǐ x0pD3`v b @k 0ev D0_v D`vb  @k 0QD`'v  @k !"D`@$""܂v $"ܒ @k @l =D`@HD`` DD`` DD``#v  @kf D``D`#vb  @kV !"D`@]$""܂v$"b  @kF XDQ`0D`#vb  @k8 !"܂`D$"?@"܂v$"b   @k'D0`0D`vb   D'쀣`@`'쀠`0D@D `0Dj`v8 Dd`v!!  @j"D@`L"0DT`#vb  @jݐ!D`!D vb  @jΐ!"܂`D$"@"܂v$"ܐ!(nbD.`v!!0 ˔ D@$  `*"JT v'a8 @j耤`@kא [ ]@k@kΐ D@"D@D``"@k 0 v  "@j `0 {@kD@`D@` @k 0@k 0P`"+`@ b+`v' a8D@vaH`@jV* *011))).x/0 0+(+,--.(.(.@.L181x224)))1 㿐b`?!"@ka vaP@j$"P` b䀣` 1uS`@v.@@k5"S`@#X  @j "S`@.v  "@i!`1v !h" @i v#b@i!p@i""㿐` ! (`)!3v `*a3v" @iՓaVb(`"@í@k""@j )3v㿈@jv@iy!@k#@ibv% !@ij@ibv  b@i!؂ $v$!h b@i @. v`!@iM@ib$ @jbv!!@i<@i~bvb  @i{" $"v$"b  @ip!h0@jbv㿐 `:%@j (3 @j ( )@j@j  # #`0@jp   #b@jg ( b@jb )`@j] )’`%㿐  @ `7@/7@7 㿐  @ `/7@/@@ /@    @   @㿈'/h᠂` H H'``@HJ㿐/h4 >   $D`  $$` $;    ?cP?c@` ``02@  @  @D#@@@ `?@    @i  @ @ $@D@`@ @  $@$@@`@ $@;`  $D`  $$` $; [   2 6 *@,4   @ #@ C@ `@  #@ #@ @ ` #@ ;  *. :  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ `@ @8 ?`? @ @ ?   㿈/g̢"H  $D`  $$` $;  <耤@??c@V`?c@` ``04@  @  @J#@ @@ `?@d٨< @hВ  @ @ $@D@`@ @  $@$@@`@ $@;`  $D`  $$` $;   44,  2,@  @ #@C@ `@  #@#@@ ` #@;  * , :  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ `@ @ `? @ @c" 肤 d ,0@ @4 @<㿐/f` @?㿐㿠㿠AVG_CHAIN_MAXAWK_HASHgstarray.cattempt to use scalar parameter `%s' as an arrayinternal error line %d, file: %sattempt to use function `%s' as an arrayattempt to use scalar `%s' as arrayfrom %s%s (%s: %s: can't allocate %ld bytes of memory (%s)array_vnamemessageconcat_expstr ? @ +# @grow_tablenewsymbol->type == Node_var_arraysubscript of array `%s' is null stringreference to uninitialized element `%s["%s"]'assoc_lookupbucket->ahname_strdelete: index `%s' not in array `%s'%s: empty (null) %s: table_size = %d, array_size = %d %s: empty (zero) %s: I: [len %d <%.*s>] V: []%g%.*s%s: is parameter %s: array_ref to %s %lulist->ahname_ref == 1list->ahname_str == NULLassoc_from_listlist->ahname_strdup_tableABEGINENDandasortasortiatan2bindtextdomainbreakclosecomplcontinuecosdcgettextdcngettextdeletedoelseexitexpextensionfflushforfuncfunctiongensubgetlinegsubifinindexintlengthloglshiftmatchmktimenextnextfileorprintprintfrandreturnrshiftsinsplitsprintfsqrtsrandstrftimestrtonumsubsubstrsystemsystimetolowertoupperwhilexorExEEJ)dEJ)fEJ)fEJ)>HEJ)}E2EJ)MTEJ)oLE3EJ)AEJ)vEJ)>yDF;F9FF 8 F(J)F0J)F@J)FH0FP>!FX>!FhJ)XFp="FxJ) XF+F$FJ)FJ)FJ*$FJ)FJ)](FJ) EFJ)/DF7F?#FJ)hDF4F6FJ)C<G:GJ)`GJ)@GJ) dG J) G(J)xG0J)CG8J))GHJ)sGXJ) XG`J) !GhJ)1GpJ)/GxJ):GJ)Lpqqq<hhRTVQ<\fuaavQg=vv%xh ]a?aa<az^RtRhvhxglWXvaxavaaYaRaVRu34MZ/yVvyavaaPaRPR>lm+D }?  #odecNO#$%&,'(u{%z###########SW#H#$############ I####Z##@7#iCDEEEFFFGGGGGHIIIJJLKNMOOPPPQQRRRRRRRRRRRRRRSRRUTTTTTVVWXXXYYZZZZZ[[\\]^]__``aabbccdddddeeffgggggghhhhhhhhiiijjkklllmmmmmmmmmmmnnnnnnnooooooooooooooppqqqrssstuvwwxyz   NLOM  jrsuP_]NNnoqptlk}~]|`Nfgde hz{wxyvmcQab^-NCDYN0!5NVTY36()*Z+/NiNW7,GE XUN.4NNN]H12J9#NNINNNN6F;:$%6K">ABNN@?NN'&!-./:AA3338pqg3E`a@ v<=vvv)=*|01*~nW&LM<333333333333"wwww3w;xxyffst-ffTUV/rW21=3^_245BEFQ`ab@@@@ @$GHIhi(")JLMC 7:@x*@jk3 !3f+-.f0BBBBB EfBFE'FB , GH GHILMJLM=Q  RSTUVW  <=XYZ[\]  <=EFEF<=9 G GHILMJwLMx   <=9 =EF9 GHIJ LM EF  GHIJKLMEF  GHIJLM  P   6,01 ,*# %,()@B,<B> <<<12>B1:12,@RSTUVWXYZ[\]=0,A<00;0n0?==#<B?= =w:)*()%01567+6:.-B0 <><F<HIJK<Od = #()pq-<cA/%&'v.z12=RSTUVWXYZ[\]#*+n-346    %'*,  &%&%&'12.12"#()*+,-B 3468;<@B !#$()*+,-3456734:68;<@AB !#$()*+,-3456734:68;<@AB !#$()*+ - 3468;<@AB% %&'12.012#=()*+,-3468;<=B !#$()*+-3468;<@B#()*+-3468#;<()*+B- 3468;<=%&'.12#()*+-3468#;< ()*+-3468;<%&'.012# ()*+-3468;<%&'./12#()*+-3468;< #()*+-3468#;<()*+-3468;<()*+-3468;<8;7<=53046/B12.>?:@A  !"#$%&'()*+,-9#####W###### ######4#}# ###L##*#####W#]###E####a2)$####.##22####Q#####=j FFFF######s##P#RTY######C###20#OwL######;###b#C########-#o"##w#w2##E*w#wu####2######2###w#w##tree->type == Node_K_printf || (tree->type == Node_builtin && tree->builtin == do_sprintf)awkgram.y%s: %s: can't allocate %ld bytes of memory (%s)make_for_loopr%.*sunexpected newline or end of stringyyerrorbufcan't read sourcefile `%s' (%s)empty program text on command lineget_src_bufsource file `%s' is emptyAWKREADFUNCcan't open source file `%s' for reading (%s)tokexpandtokstartfunction `%s' called with space between name and `(', or used as a variable or an arraystring (number (%.17g) string value (number value (%.17g) ?? flags %s ) wcould not open `%s' for writing (%s)j == var_count%.*s: array, %ld elements unused variable dump_varstablesending profile to standard error%s: close failed (%s)dump_funcstabj == func_countfunction `%s': parameter `%s' shadows global variablethere were shadowed variables.shadow_funcsshadow_funcs() called twice!func_usefp->namefpregister_deferred_variabledv#: %s:%d msgid msgstr "" %s third parameter is not a changeable objectmatch: third argument is a gawk extension%s: string literal as last arg of substitute has no effectclose: second argument is a gawk extensionmsgid_plural msgstr[0] "" msgstr[1] "" use of dcgettext(_"...") is incorrect: remove leading underscore%d is invalid as number of arguments for %suse of dcngettext(_"...") is incorrect: remove leading underscoreplain `print' in BEGIN or END rule should probably be `print ""'syntax errorunterminated regexpsource file does not end in newlineinvalid char '%c' in expressioncall of `length' without parentheses is deprecated by POSIXold awk does not support the keyword `in' except after `for'non-redirected `getline' undefined inside END actionDuplicate `default' detected in switch body`return' used outside function context`%s' used in %s actionregular expression on right of comparisonregular expression on left of `~' or `!~' operatorregular expression on right of assignmenteach rule must have a pattern or an action part%s blocks must have an action part-+multistage two-way pipelines don't work`%s' is a built-in function, it cannot be redefinedregexp constant `//' looks like a C++ comment, but is notregexp constant for parameter #%d yields boolean valuefunction `%s' called but never definedfunction `%s' defined but never calleduse of non-array as arraytawk regex modifier `/.../%c' doesn't work in gawk%s: %d: tawk regex modifier `/.../%c' doesn't work in gawkunterminated regexp at end of fileunterminated regexp ends with `\' at end of fileparser stack overflowstatement may have no effect`%s' is a gawk extension`%s' is a Bell Labs extensionPOSIX does not allow `%s'`%s' is not supported in old awkgotoduplicate case values in switch body: %sinternal error line %d, file: %syylextokkeyold awk does not support multiple `BEGIN' or `END' rulesfunction `%s': can't use function name as parameter name`nextfile' is a gawk extensiondup_parmsnamesfunction `%s': parameter #%d, `%s', duplicates parameter #%dPOSIX does not allow operator `**'old awk does not support operator `**'POSIX does not allow operator `**='old awk does not support operator `**='switch_bodycase_valuesregexp constant `/%s/' looks like a C comment, but is notunterminated stringinvalid subscript expressionold awk does not support multidimensional arrayscall of `length' without parentheses is not portable(yyvsp[0].nodeval)->rnode->type == Node_expression_list`goto' considered harmful! `delete(array)' is a non-portable tawk extension`delete array' is a gawk extensionfunction name `%s' previously definedfunc_installpnamesnumeric constant `%.*s' treated as hexadecimalnumeric constant `%.*s' treated as octalbackslash not last character on lineoperator `^=' is not supported in old awkoperator `^' is not supported in old awkugh. fdopen: %s debugging read/close screwed up!builtin.c%s to "%s" failed (%s)reason unknownstandard outputinternal error line %d, file: %sexp: received non-numeric argumentexp: argument %g is out of rangefflush: cannot flush: pipe `%s' opened for reading, not writingfflush: cannot flush: file `%s' opened for reading, not writingfflush: `%s' is not an open file, pipe or co-process/dev/stderr/dev/stdoutindex: received non-string first argumentindex: received non-string second argumentint: received non-numeric argumentlength: received non-string argument`length(array)' is a gawk extensionAlog: received non-numeric argumentlog: received negative argument %g 00123456789abcdef0123456789ABCDEFi == num_args[s]printf: format specifier does not have control lettertoo many arguments supplied for format stringnot enough arguments to satisfy format string^ ran out for this one%s `%s' %*s%sarg count %ld greater than total number of supplied arguments%.0f%s: %s: can't allocate %ld bytes of memory (%s)format_treecpbufs[1].buf`h' is meaningless in awk formats; ignored`L' is meaningless in awk formats; ignored`l' is meaningless in awk formats; ignoredcpbufs[1].bufsize > 0C[s]printf: value %g is out of range for `%%%c' formatobufmust use `count$' on all formats or nonethe_argscpbufs[0].buf`h' is not permitted in POSIX awk formats`l' is not permitted in POSIX awk formats`$' not permitted after period in format`$' is not permitted in awk formatsarg count with `$' must be > 0`L' is not permitted in POSIX awk formatsno `$' supplied for positional field width or precisionprintf: no argumentsprintfsqrt: received non-numeric argumentsqrt: called with negative argument %gsubstr: start index %g is invalid, using 1substr: source string is zero lengthsubstr: length %g is not >= 0substr: start index %g is past end of stringsubstr: non-integer start index %g will be truncatedsubstr: length %g at start index %g exceeds length of first argument (%lu)substr: non-integer length %g will be truncatedsubstr: length %g too big for string indexing, truncating to %gsubstr: length %g is not >= 1do_substrsubstr?AAA%a %b %d %H:%M:%S %Z %Ystrftime: received non-numeric second argumentstrftime: received non-string first argumentstrftime: received empty format stringdo_strftimebufpmktime: received non-string argument%ld %d %d %d %d %d %dsystem: received non-string argumentprintdo_printtreference to uninitialized field `$%d'wide_tolower_touppertolower: received non-string argumenttoupper: received non-string argumentatan2: received non-numeric first argumentatan2: received non-numeric second argumentsin: received non-numeric argumentcos: received non-numeric argumentAsrand: received non-numeric argument%ddo_matchbufmatch: third argument is not an arrayA?\\\&\\&sub_commonmb_indicesgensub: third argument of 0 treated as 1?Alshift: received non-numeric first argumentlshift: received non-numeric second argumentlshift(%lf, %lf): negative values will give strange resultslshift(%lf, %lf): fractional values will be truncatedlshift(%lf, %lf): too large shift value will give strange results@Prshift: received non-numeric first argumentrshift: received non-numeric second argumentrshift(%lf, %lf): negative values will give strange resultsrshift(%lf, %lf): fractional values will be truncatedrshift(%lf, %lf): too large shift value will give strange results@Pand: received non-numeric first argumentand: received non-numeric second argumentand(%lf, %lf): negative values will give strange resultsand(%lf, %lf): fractional values will be truncatedor: received non-numeric first argumentor: received non-numeric second argumentor(%lf, %lf): negative values will give strange resultsor(%lf, %lf): fractional values will be truncatedxor: received non-numeric first argumentxor: received non-numeric second argumentxor(%lf, %lf): negative values will give strange resultsxor(%lf, %lf): fractional values will be truncatedcompl: received non-numeric argumentcompl(%lf): negative value will give strange resultscompl(%lf): fractional value will be truncated@0@ LC_ALLLC_COLLATELC_CTYPELC_MESSAGESLC_MONETARYLC_NUMERICLC_TIMExdcgettext: `%s' is not a valid locale categoryA:alpha:]:upper:]:lower:]:digit:]:xdigit:]:space:]:punct:]:alnum:]:print:]:graph:]:cntrl:]:blank:]HlXhx  4HMemory exhaustedUnbalanced [Unfinished \ escapeunfinished repeat countmalformed repeat countupperlowerUnbalanced (CPOSIXNo syntax specifiedUnbalanced )׸טx|אptmemory exhaustedinternal error line %d, file: %sext.c`extension' is a gawk extensionextension: cannot open `%s' (%s) extension: library `%s': cannot call function `%s' (%s) extension: missing function nameextension: function `%s' already definedextension: can't use gawk built-in `%s' as function nameextension: illegal character `%c' in function name `%s'p%dextension: can't redefine function `%s'extension: function name `%s' previously defined%s: %s: can't allocate %ld bytes of memory (%s)make_builtinvnamesparm_namesfunction `%s': argument #%d: attempt to use array as a scalarfunction `%s': missing argument #%dfunction `%s': argument #%d: attempt to use scalar as an arrayfunction `%s' defined to take no more than %d argument(s)field.c%s: %s: can't allocate %ld bytes of memory (%s)init_fieldsfields_arrgrow_fields_arrset_recorddatabufNF != -1NF set to negative value(n->flags & WSTRCUR) == 0rebuild_recordopsinternal error line %d, file: %ssplit: null string for third arg is a gawk extensionsplit: second argument is not an arraynull string for `FS' is a gawk extensionold awk does not support regexps as value of `FS'FS[%c ]invalid FIELDWIDTHS value, near `%s'FIELDWIDTHS`FIELDWIDTHS' is a gawk extensionset_FIELDWIDTHS.:/usr/pkg/share/awkAWKBUFSIZEexactposix/gawkmisc.ccan't stat fd %d (%s)%s %s `%s': could not set close-on-exec: (fcntl: %s)gawkmisc.c%s: %s: can't allocate %ld bytes of memory (%s)xmallocpPOSIXLY_CORRECT--%s: option `--%s' doesn't allow an argument %s: option `%c%s' doesn't allow an argument %s: unrecognized option `--%s' %s: unrecognized option `%c%s' %s: illegal option -- %c %s: invalid option -- %c %s: option `%s' requires an argument %s: option `%s' is ambiguous %s: option requires an argument -- %c %s: option `-W %s' is ambiguous %s: option `-W %s' doesn't allow an argument close of fd %d (`%s') failed (%s)RED_FILERED_PIPERED_READRED_WRITERED_APPENDRED_NOBUFRED_EOFRED_TWOWAYRED_PTYRED_SOCKETRED_TCP 0@HX`pio.cclose of `%s' failed (%s).reached system limit for open files: starting to multiplex file descriptorstoo many pipes or input files openerror writing standard error (%s)pipe flush of `%s' failed (%s).co-process flush of pipe to `%s' failed (%s).file flush of `%s' failed (%s).error writing standard output (%s)internal error line %d, file: %sfile-/dev//inet/raw/no (known) protocol supplied in special filename `%s'fd/udp/0stdinstdoutstderrtcp/file `%s' is a directory/inet/raw client not ready yet, sorry/inet/raw server not ready yet, sorryremote host and port information (%s, %s) invalidmust supply a remote port to `/inet'must supply a remote hostname to `/inet'special file name `%s' is incompletelocal port %s invalid in `/inet'%s: %s: can't allocate %ld bytes of memory (%s)spec_setupcp no explicit close of socket `%s' providedno explicit close of co-process `%s' providedno explicit close of pipe `%s' providedno explicit close of file `%s' providedclose: redirection `%s' not opened with `|&', second argument ignoredfailure status (%d) on pipe close of `%s' (%s)failure status (%d) on file close of `%s' (%s)toclose: `%.*s' is not an open file, pipe or co-processclose of redirection that was never openedfromclose: second argument must be `to' or `from'rAWKPATHdo_pathopentrypathregister_open_hookohiop_allociopdata file `%s' is emptyiop->buf/dev/fd//dev/stdin/dev/stdout/dev/stderr/dev/pid/dev/ppid/dev/pgrpid/dev/usercould not open `%s', mode `%s'cannot open file `%s' for reading (%s)use `PROCINFO[...]' instead of `/dev/user'%d %d %d %d%duse `PROCINFO["%s"]' instead of `%s'%d could not allocate more input memoryrecm.rt_start != NULLrecm.start != NULLgrow_iop_buffererror reading input file `%s': %smulticharacter value of `RS' is a gawk extensionclose of pipe failed (%s)rww%s%.*spty/dev/ptmx/dev/pty%c%x/bin/shsh-cpipeptemldtermclose of slave pty failed (%s)/dev/pty%c0socketto/frommoving pipe to stdout in child failed (dup: %s)close of stdout in child failed (%s)pty_vs_pipefull_indexmoving pipe to stdin in child failed (dup: %s)close of stdin in child failed (%s)r+close of master pty failed (%s)moving slave pty to stdin in child failed (dup: %s)moving slave pty to stdout in child failed (dup: %s)>>>expression in `%s' redirection only has numeric valueexpression for `%s' redirection has null string valueunnecessary mixing of `>' and `>>' for file `%.*s'|&|<1filename `%s' for `%s' redirection may be result of logical expressionabacan't open pipe `%s' for input (%s)can't redirect from `%s' (%s)can't open two way pipe `%s' for input/output (%s)invalid tree type %s in redirect()redirectstrrpcan't open pipe `%s' for output (%s)cannot open pipe `%s' (%s)cannot create child process for `%s' (fork: %s)can't redirect to `%s' (%s)can't open two way socket `%s' for input/output (%s)?IOP_IS_TTYIOP_IS_INTERNALIOP_NO_FREEIOP_NOFREE_OBJIOP_AT_EOFIOP_CLOSEDIOP_AT_START`p @%.6gawkvars.outcompattraditionallintlint-oldposixnostalgiagen-ponon-decimal-dataprofilecopyleftcopyrightfield-separatorfilere-intervalsourcedump-variablesassignversionusagehelpexecuse-lc-numeric(0@lHX`|pxpCCFfxsdvVuuS \CONVFMTNFFIELDWIDTHSNRFNRFS RS IGNORECASEFILENAMEOFSORSOFMTRLENGTHRSTARTSUBSEPARGINDERRNORTBINMODELINTTEXTDOMAINmessages V \HW]7X70Y aiZ$G,_  `(^ hL0G 8G@cHPGXG `GDhUp[xb main.c%s: %s: can't allocate %ld bytes of memory (%s)add_src*dataUsage: %s [POSIX or GNU style options] -f progfile [--] file ... Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ... POSIX options: GNU long options: -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val -m[fr] val -W compat --compat -W copyleft --copyleft -W copyright --copyright -W dump-variables[=file] --dump-variables[=file] -W exec=file --exec=file -W gen-po --gen-po -W help --help -W lint[=fatal] --lint[=fatal] -W lint-old --lint-old -W non-decimal-data --non-decimal-data -W profile[=file] --profile[=file] -W posix --posix -W re-interval --re-interval -W source=program-text --source=program-text -W traditional --traditional -W usage --usage -W use-lc-numeric --use-lc-numeric -W version --version To report bugs, see node `Bugs' in `gawk.info', which is section `Reporting Problems and Bugs' in the printed version. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: gawk '{ sum += $1 }; END { print sum }' file gawk -F: '{ print $1 }' /etc/passwd error writing standard output (%s)Copyright (C) 1989, 1991-%d Free Software Foundation. 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 3 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, see http://www.gnu.org/licenses/. ENVIRONAWKPATHPROCINFOpgrpid3.1.6pidppiduideuidgidegidgroup%d`%s' is not a variable name, looking for file `%s=%s'%s: `%s' argument to `-v' not in `var=value' form C`%s' is not a legal variable namefatal error: internal errorfloating point exceptioninternal error line %d, file: %s+F:f:v:W;m:DTIDYMEMWHINY_USERSgawk/usr/pkg/lib/locale@(#)rw/dev/null%s: option requires an argument -- %c POSIXLY_CORRECT`--posix'/`--traditional' overrides `--non-decimal-data'ARGVARGCempty argument to `--source' ignoredawkprof.out`-m[fr]' option irrelevant in gawk-m option usage: `-m[fr] nnn'%s: option `-W %s' unrecognized, ignored fatalinvalid-Ft does not set FS to tab in POSIX awkrunning %s setuid root may be a security problemenvironment variable `POSIXLY_CORRECT' set: turning on `--posix'can't set binary mode on stderr (%s)can't set binary mode on stdin (%s)no program text at all!`--posix' overrides `--traditional'could not find groups: %sawk: bailing out near line 1 init_groupsetgroupsetcan't set binary mode on stdout (%s)%s: %s:cmd. line:%d: FILENAME=%s FNR=%ld) warning: error: fatal: n->type == Node_valnode.cn->wstptr != NULL%s: %s: can't allocate %ld bytes of memory (%s)more_nodesnextfreedupnoder->stptrr->ahname_strr->wstptrold != NULLold awk does not support the `\%c' escape sequenceescape sequence `\%c' treated as plain `%c'POSIX does not allow `\x' escapesno hex digits in `\x' escape sequencebackslash at end of stringmake_str_node%.0f(n->flags & (STRING|STRCUR)) != 0str2wstrn->wstptr*ptr?random: not enough state (%ld bytes); ignored. random: state info corrupted; not changed. GAWK_NO_DFAre.c()|*+?.^$\[]%s: %s: can't allocate %ld bytes of memory (%s)make_regexprprp->pat.fastmapdest%s: /%s/internal error line %d, file: %s%st->type == Node_regex*+|?RE_BACKSLASH_ESCAPE_IN_LISTSRE_BK_PLUS_QMRE_CHAR_CLASSESRE_CONTEXT_INDEP_ANCHORSRE_CONTEXT_INDEP_OPSRE_CONTEXT_INVALID_OPSRE_DOT_NEWLINERE_DOT_NOT_NULLRE_HAT_LISTS_NOT_NEWLINERE_INTERVALSRE_LIMITED_OPSRE_NEWLINE_ALTRE_NO_BK_BRACESRE_NO_BK_PARENSRE_NO_BK_REFSRE_NO_BK_VBARRE_NO_EMPTY_RANGESRE_UNMATCHED_RIGHT_PAREN_ORDRE_NO_POSIX_BACKTRACKINGRE_NO_GNU_OPSRE_DEBUGRE_INVALID_INTERVAL_ORDRE_ICASERE_CARET_ANCHORS_HERERE_CONTEXT_INVALID_DUPRE_NO_SUB@`p @ 0@ P@`p @ 8P,Hex D_SuccessNo matchInvalid regular expressionInvalid collation characterInvalid character class nameTrailing backslashInvalid back referenceUnmatched [ or [^Unmatched ( or \(Unmatched \{Invalid content of \{\}Invalid range endMemory exhaustedInvalid preceding regular expressionPremature end of regular expressionRegular expression too bigUnmatched ) or \)!IS_EPSILON_NODE (node->token.type)regcomp.cnode->next == NULLright > -1left > -1upperalphaloweralnumcntrlspacedigitprintblankgraphpunctxdigit0_num >= 0regexec.cerr == REG_ESPACEregs_allocated == REGS_FIXEDregs->num_regs >= nregspmatch[0].rm_so == start;Zx0Nm<[y1On@v@8@NUUUAUUU@(#)GNU Awk 3.1.6Node_illegalNode_timesNode_quotientNode_modNode_plusNode_minusNode_cond_pairNode_subscriptNode_concatNode_expNode_preincrementNode_predecrementNode_postincrementNode_postdecrementNode_unary_minusNode_field_specNode_assignNode_assign_timesNode_assign_quotientNode_assign_modNode_assign_plusNode_assign_minusNode_assign_expNode_assign_concatNode_andNode_orNode_equalNode_notequalNode_lessNode_greaterNode_leqNode_geqNode_matchNode_nomatchNode_notNode_rule_listNode_rule_nodeNode_statement_listNode_switch_bodyNode_case_listNode_if_branchesNode_expression_listNode_param_listNode_K_ifNode_K_switchNode_K_caseNode_K_defaultNode_K_whileNode_K_forNode_K_arrayforNode_K_breakNode_K_continueNode_K_printNode_K_print_recNode_K_printfNode_K_nextNode_K_exitNode_K_doNode_K_returnNode_K_deleteNode_K_delete_loopNode_K_getlineNode_K_functionNode_K_nextfileNode_redirect_outputNode_redirect_appendNode_redirect_pipeNode_redirect_pipeinNode_redirect_inputNode_redirect_twowayNode_var_newNode_varNode_var_arrayNode_valNode_builtinNode_line_rangeNode_in_arrayNode_funcNode_func_callNode_cond_expNode_regexNode_dynregexNode_hashnodeNode_ahashNode_array_refNode_BINMODENode_CONVFMTNode_FIELDWIDTHSNode_FNRNode_FSNode_IGNORECASENode_LINTNode_NFNode_NRNode_OFMTNode_OFSNode_ORSNode_RSNode_SUBSEPNode_TEXTDOMAINNode_final --- this should never appear 0@P`p€ °(8H`xÈàø(8HXhxĈĘĨ(8HXhxňŘŨŸ 0@XhxƈƠƸ(8HXhxLjǘǨǸ(@PXhxȀȈȘȨȸCPOSIXunknown nodetype %deval.cbuffer overflow in genflags2strMALLOCTEMPPERMSTRINGSTRCURNUMCURNUMBERMAYBE_NUMARRAYMAXEDFUNCFIELDINTLSTRWSTRCUR @ (8HPX`??nloops_active > 0curfcall >= 0type = %s internal error line %d, file: %sattempt to field reference from non-numeric valuereference to uninitialized field `$%d'reference to uninitialized variable `%s'assignment is not allowed to result of builtin functionattempt to use array `%s' in a scalar contextattempt to reference from null stringcan't use function name `%s' as variable or arrayattempt to access field %dstatement has no effect`continue' outside a loop is not portable`continue' outside a loop is not allowed`break' outside a loop is not portable`break' outside a loop is not allowed`nextfile' cannot be called from an END rule`next' cannot be called from an END rulelist[j-1] == tfor loop: array `%s' changed size from %ld to %ld during loop execution%s: %s: can't allocate %ld bytes of memory (%s)push_forlooploop_stack`next' cannot be called from a BEGIN rule`nextfile' cannot be called from a BEGIN rulefor_looplistpush_argsfcallsfunction `%s' called with more arguments than declaredfunction `%s' not definedfcalls[curfcall].stackreference to uninitialized argument `%s'illegal type (%s) in tree_evalconcatenation: side effects in one expression have changed the length of another!assignment used in conditional contextdivision by zero attempted in `%%'division by zero attemptedtree_evaltreeliststrstrlistinterpretnvall->stptrdivision by zero attempted in `/='division by zero attempted in `%%='?`IGNORECASE' is a gawk extensionrwrwwr`BINMODE' is a gawk extensionBINMODE: arbitrary string value treated as "rw"efgEFG +-#'bad `%sFMT' specification `%s'CONVOfmt_indexfmt_listturning off `--lint' due to assignment to `LINT'invalidfatalfile != NULLprofile.cwcould not open `%s' for writing: %ssending profile to standard errorindent_level >= 0%6ld \%c" "%c %c\a%c\%03ounexpected type %s in prec_level! (SUBSEPTEXTDOMAINRSORSOFSOFMTNRNFIGNORECASEFSFNRFIELDWIDTHSCONVFMTBINMODE!~~ %s ? : %s( || = --++getlinefor (# treated internally as `delete' in %s) { %s %s' delete %s[] ! && - ^= -= += %%= /= *= illegal type (%s) in tree_eval * >= %% / == ^ - + <= > < != internal error: %s with null vname%g# this is a dynamically loaded extension functioninternal error line %d, file: %s, pp_list: got %s tree->type == Node_expression_list%s[LINTassignment is not allowed to result of builtin functionattempt to use array `%s' in a scalar context|>><|&> $0$0while () { } ; in break continue printprintfnext if () {} else { switch (case : default: nextfile exitdo { } while () returndelete %s # %ldfunction %.*s() { } # Functions, listed alphabetically in %s # gawk profile, created %s # BEGIN block(s) BEGIN { # Rule(s) # END block(s) END { @AD|  (00<0H0T0`0l0x00000000000000 0,080D0P0\0h0t0000000000000~0{0x(0u40r@0oL0lX0id0fp0c|0`0]0Z0W0T0Q0N0K0H0E0B0? 0<09$06003<00H0-T0*`0'l0$x0!0000000 0 00000 0,080D0P0\0h0t000000000000000(040@0L0X0d0p0|000000000000 0|0y$0v00s<0pH0mT0j`0gl0dx0a0^0[0X0U0R0O0L0Iu6Jb Ad A.4 # oo@XoA@ oo\R@builtin(END OF FILE)<:'?]8]4H ]4X ]4h ]4]4x\d \d \d [@h9gt>QNPaPkqj,jH6T7YqϑI 7RǤq)>Oq9NNL(Kɲ@KCS[kA4@4.*+(){}[]|?^$\  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ \bfnrtv\zR|P 9d - zR|P =T - as: Sun Compiler Common 10 Patch 09/04/2007 as: Sun Compiler Common 10 Patch 09/04/2007 @(#)SunOS 5.10 Generic January 2005as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 ld: Software Generation Utilities - Solaris Link Editors: 5.10-1.489.interp.hash.dynsym.dynstr.SUNW_version.rela.got.rela.bss.rela.plt.text.init.fini.rodata.dynamic.data.ctors.dtors.eh_frame.jcr.data.rel.local.symtab.strtab.comment.debug_abbrev.debug_info.debug_line.debug_frame.debug_pubnames.debug_aranges.debug_ranges.debug_str.shstrtab ,  ".4.4#o@X@X`-B@@$  7B@@< ABAA KGGQAdAdWAA]AA2((4F\\ eDDn88t{d||<4V% /bin/gawk-3.1.6000555 000000 000000 00000000000 11043376423 014540 1bin/gawkustar00rootroot000000 000000 bin/igawk000555 000000 000000 00000006023 11043376424 012637 0ustar00rootroot000000 000000 #! /bin/sh # igawk --- like gawk but do @include processing # # Arnold Robbins, arnold@skeeve.com, Public Domain # July 1993 if [ "$1" = debug ] then set -x shift fi # A literal newline, so that program text is formatted correctly n=' ' # Initialize variables to empty program= opts= while [ $# -ne 0 ] # loop over arguments do case $1 in --) shift; break;; -W) shift # The ${x?'message here'} construct prints a # diagnostic if $x is the null string set -- -W"${@?'missing operand'}" continue;; -[vF]) opts="$opts $1 '${2?'missing operand'}'" shift;; -[vF]*) opts="$opts '$1'" ;; -f) program="$program$n@include ${2?'missing operand'}" shift;; -f*) f=`expr "$1" : '-f\(.*\)'` program="$program$n@include $f";; -[W-]file=*) f=`expr "$1" : '-.file=\(.*\)'` program="$program$n@include $f";; -[W-]file) program="$program$n@include ${2?'missing operand'}" shift;; -[W-]source=*) t=`expr "$1" : '-.source=\(.*\)'` program="$program$n$t";; -[W-]source) program="$program$n${2?'missing operand'}" shift;; -[W-]version) echo igawk: version 2.0 1>&2 gawk --version exit 0 ;; -[W-]*) opts="$opts '$1'" ;; *) break;; esac shift done if [ -z "$program" ] then program=${1?'missing program'} shift fi # At this point, `program' has the program. expand_prog=' function pathto(file, i, t, junk) { if (index(file, "/") != 0) return file for (i = 1; i <= ndirs; i++) { t = (pathlist[i] "/" file) if ((getline junk < t) > 0) { # found it close(t) return t } } return "" } BEGIN { path = ENVIRON["AWKPATH"] ndirs = split(path, pathlist, ":") for (i = 1; i <= ndirs; i++) { if (pathlist[i] == "") pathlist[i] = "." } stackptr = 0 input[stackptr] = ARGV[1] # ARGV[1] is first file for (; stackptr >= 0; stackptr--) { while ((getline < input[stackptr]) > 0) { if (tolower($1) != "@include") { print continue } fpath = pathto($2) if (fpath == "") { printf("igawk:%s:%d: cannot find %s\n", input[stackptr], FNR, $2) > "/dev/stderr" continue } if (! (fpath in processed)) { processed[fpath] = input[stackptr] input[++stackptr] = fpath # push onto stack } else print $2, "included in", input[stackptr], "already included in", processed[fpath] > "/dev/stderr" } close(input[stackptr]) } }' # close quote ends `expand_prog' variable processed_program=`gawk -- "$expand_prog" /dev/stdin <@CDFKLNOPRTVWXZ[\^_`abdefijklopqsvyz|}~   !"%()+-/01234678:<=>ACEFIJKLNOQRSUWXZ[\]`bcdfgijlmnoprsuwxy{|~  $&+.78:=?ABEGHIJMQSUY]cghmnrtuwx{   #$&'*,.59;?@BDGHMPTVY^_aehkqtvz}ߘ (| 8-R 9K E R]L \cf q{X vop  : D  )h q  lt   &/T  ? @!DJH O X8aPpv  P T l @ $f 8h D #P4>BM\` X< `pjp8(  ;\ D C` (d  \ @ !< ,3@4 <pC4 NHU^% ihqhxH \M4 4@` @ (h T δx , 0X )1  T &\ S4| 1P >PE KTYޘ c jL }% , `/h<  | n ((@ < % 4     LP (=d 2h< > @9T8 =Ii` RLWh< b7X i8  p% })44 z   H ! 4͜  l X7, T\  d]X, dX߼#/7p ;X J SZx a70 i  q vMx\  0  D:h lt :AHҔ YahT ns7 P` l  %, 9 T  (j /X a>  7H?X I4 d4lx [}\ "H@  Sm 3p X  Phh  @ ߀ 0 *4   ( B S, ^h   g4 z h  d   0  %  kdL )p   Vt [D  ` \  & 3 T ?\ E N;X W0 ^` f n| u!@    8x ~H yh   ` ~    ( u hP ` kx  x0 $x X w4 4 e )<h 5]$ =Lx F74X SH' _T hl l tT   B @ l   t      (\  t ݔx ', ,< 54 A< \ v7  Kt4 W | _k fZ( s z  h     dP 6 ` /<, ^ L I p\ < 4 ,   + 3 { d < C M \D b(D h y  @   l  D D     , Ӵl  V$` *  \ '-a 7<@6l QX _fmw 87, < d ( ݘ p   T;@@ D    E p$\ 2 h ;{t C4 LtT )xh ]D jH Qxt| T ߌ  hD  < xߤ, t "D   `!'L.( 8LUht _d gv t߰{Gt   t &hd<Lh l X |tx< $ Xq|  X - 9D4  H @ D  preallocdlopenisdirpunctlibintl_dcgettextassoc_cleararray_vnameiopflags2strdo_lshiftyylvaldo_asortiOFS_nodedo_compldo_tolowerin_begin_ruledo_srandPROCINFO_nodeos_setbinmode__re_error_msgiddump_fcall_stackunlockptdlerrorfmodwcrtombbtowcARGV_nodeOFMT_nodeset_FSstrtouliswlowerr_force_string__iobget_actualdo_splitnextfreeversion_stringqsortre_set_syntaxr_dupnodeopterrstrchrpipeFNR_noder_tree_evalgeteuidNnull_stringdlsymdo_asortvfprintfORS_nodelistenptsnameyynerrsre_match_2errcountdo_strftimelibintl_dgettextacceptdo_sinCONVFMTidxset_SUBSEPwarningstack_ptrctimeinit_profiling_signalsparse_escape__lshrdi3_finido_randsourcepcloseuse_lc_numericset_OFS.divvariables__mktime_internallibintl_gettextARGIND_node__umoddi3towupperr_fataldo_systemre_matchsocket__mon_ydaysetjmp__flsbufos_devopenmbsinitnloopsdouble_to_intset_BINMODEconcat_expgetuidforkset_OFMTos_close_on_execisnondecimalrefreestrtodgawk_mb_cur_maxdo_subre_updateaccessexitingoptimal_bufsizeregister_open_hookmake_builtinstrcmperrnostrrchr_exit_etextdo_mktimeupdate_ERRNO_savedadjust_uintgawk_initstatetcsetattrgetgroupsfstat64binddo_expupdate_ERRNOset_IGNORECASEos_isdirCeildfacompset_ORSTEXTDOMAIN_nodeget_actual_argumentdo_printf__udivdi3set_NFmsgdo_tidy_memdo_inputreaddo_getlinegetoptset_NRos_arg_fixupos_is_setuidcheck_special__ctypedefpathngroupsresearchMRLRS_is_nulliswalnumload_casetable_getopt_long_rregcompnloops_activeassoc_dumpoptarggetaddrinfonl_langinfogetopt_longstrncasecmpmbstowlowerstrcpydo_logpp_funcdfainit.remdo_closeset_LINTr_force_numberlibintl_dcngettextgetredirect__cmpdi2_GLOBAL_OFFSET_TABLE_numfileslocaltimereflags2strnodetype2strdfaerrorend_blockdo_sqrtdfaparsemake_regexpdo_atan2optind_edatamatch_mb_charsetgrantptatexitunrefceilgetopt_long_onlyset_CONVFMTpathopendo_dump_varsNull_fielddo_bindtextdomainmore_nodesgawk_nameredflags2strdo_profilingCONVFMT_node__deregister_frame_inforelease_all_varsset_RSdo_gsub__dtollfree_wstrregister_deferred_variablememmovestrncasecmpmake_str_nodesscanfset_FIELDWIDTHSreset_recordBINMODE_nodeNF_nodedo_printdo_gensubOFMTidxlibintl_bindtextdomaindo_ordo_sprintf__dtoullexeclARGC_node__dso_handle_PROCEDURE_LINKAGE_TABLE_expression_valuesourcelinecopynodeinit_profilingset_FNRiswctypedo_andisattydo_toupperre_searchsrcfilesFloorfputsgetfnameos_restore_modeshutdownwaitassoc_lookupdo_nextfilere_compile_fastmapcallocgenflags2strshadow_funcsremaybelong.udivret_nodeflush_iogetpidmyname_environfwritedo_substrusing_fieldwidthsgmtimedump_progdo_dcngettextioctlinterpretFS_re_yes_casedo_nostalgiatmp_stringtokexpandyyparsexmallocget_curfunc_arg_countmbrlendefault_FS__floatdidfdo_intlclose_iodo_print_recformat_treein_arraydupset_locset_prof_fileregerror_Jv_RegisterClassesdo_coslocaleconvoptoptstrcasecmpregexecin_end_rulefgetsoutput_is_ttydo_lint_old__register_frame_infoatofispath.umuldfaexecatoido_indexgawk_random__ashldi3do_strtonumwcscolldo_xordo_deletedo_fflushhashFILENAME_nodestrlendo_traditionalfdopenRLENGTH_nodegroupsetavoid_dfado_systimedo_adumpmk_numberarray_initassign_valarg_assignget_fieldSUBSEP_nodebegin_blockgetegiddo_posixenvsepFS_regexpset_TEXTDOMAINfputcfcntlFIELDWIDTHS_nodembrtowcORSlenLINT_nodefreeaddrinfopow_lib_versiondo_int.uremlintfuncfield0_validreisstringENVIRON_nodere_set_registers_getopt_internal_rdo_delete_loop__assertfloordo_rshiftsnprintf_getopt_internalfclosestopmesignalmemcmptcgetattrIGNORECASE_node_getopt_long_only_rconnect_DYNAMICstrcollgetgidfilenodump_funcs__clz_tabfields_arrexit_valsetlocalewstrstrlongjmpERRNO_nodeformat_valdo_matchgawk_setstateiswupperinstalldfastatestrncpyrecvfromget_argumentdo_lengthRSTART_noder_get_lhsresetup__re_error_msgid_idxOFSlenwcasestrstrFS_re_no_casekillwhiny_usersstrerrorset_valuestr2wstrregfreedo_lintquotedo_intervalsfmt_list_endfopen64dfasyntaxdo_non_decimal_datare_compile_patterndfafreedo_dcgettextmemcpy_startpopensetsockoptlibintl_textdomaindfaanalyzeabortstrncmpgetpgrpinit_fieldsgawk_srandomcmp_nodesyycharpp_string_fpmemsetgetppidre_syntax_optionsnondec2awknumre_search_2getenvdo_extlibc.so.1SUNW_1.22libsocket.so.1SUNW_1.4libm.so.2SUNW_1.1libintl.so.3libiconv.so.2libnsl.so.1/usr/pkg/lib:/usr/pkg/gcc34/lib:/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6:/usr/pkg/gcc34/lib/gcc/sparc-sun-solaris2.10/3.4.6/G yQ[ ='js ='}5޼A) H o dq ,A85DPn\LhStD߀ߌߘߤ߰߼wI(4@^LX&dp|$PVB:U=|n $,0<HT`lx#7Q?O`: ,d8DP\htL(.p(k4]@,LXdpS|{29qF d$0<HUT)`_l1xzi3wv7 y,F80DjP8\ hXts? @D# @eQ @e@, @ ǖ"@@e@e㿐#/e `  @  `@@`" `@$@```$``@e`  +㿐㿐/eͮh`, ` @et ```( `@ei㿐㿐Q@eb Ѐ   `I @ `+ Q@eU !Q@eS` Yb#b` + @ ;` @ @ +  ` `+  b㿐 `*9  V bp(` `T3`F' H`*`H9`T" $`4 $b%Q( @: sQ!@e @9 ` $b뀦`QQ!8@- h& &  $b"ǖ ƀ   @ pQ!`@ vQې!㿐 `*"MV `T" u ` `H2q Q@dԐ!@d    @d  @`T @dǐ@dȒ)"`0@!"@83 "Q a@d@d , ,, @d,   @d@d `T ),, /"Ã(`bp @d  %" b@d %"$"Q  @Q@dx!Ƞ@dcQQa@Q  㿐 `)& `G`I" $@  $h `  ?b "@`$@  "Q `G`I" $@  $(`0`h `  ?"  b " @\ `b@  @` @d "Q @d   $`@  C-Q N @,@` "Q `GL`I"Y $@氒  $(`0`h `  ?b " @ @E$@@cߒ U @c   $`@  Ā $@@Ӕ  $`2 $]h"(`@ $@c @@f `$@ h"F $@אB $h"(`@ $@c `$@ UU@@ QQ!8@!!&@Q@cs!Ƞ@ccQQb @!8@!#Q!8@! !㿐 `$` ,@`" #@` @@@ 2`  #@@ @cP  $~6 $& & &㿐` ``` 0`2& F@c90B+`Tc@* N@ * @ @ * N@ * @ @ * N@ * @ @ * N@ * @ @ * N@ * @ @ * N@ * @ @ * N@ * @ @ * N@ * @ @ǰ SSSSxS\S@S$S㿐 .@ " `  "    @b`  2  㿐x F `  b@ ˒`$`    @M  $` @E㿐Qb$ ` @+`@`@,` $aA6 $@bx )@b     ,`   ,@bn&&&  @bk* $$`2 & && Q"@h Q@b;!Ƞ@bIcQQbx@^㿈 `HQQ"`@bE!`$h ` `?b "@O`U$~4$$$b`@1" @ @ @2f` "` `{Q`$a $@bb g!#8 I$#8 $`6 $`$ S & -& `& ` & + #8&@&`$#86`$`$& ,@ && k#@ b` @`ߔ "1`$`Y@d0U` @a  <& ` & ` @a`  +@@;` Q+@@a"آQ @"c@`"@a@at"Q @"c@yQ"*@ Q@a^!Ƞ@alc` QQc@ 㿐 `U ` b`2NQ $`d0Fb @ * @    @ ` @a8  2  $`4`5- &@@ @Ő`.$* @a$~4$$$@a $@@`#0Q @"pc@  $@̀`#@ 㿈'  0   +``` 4+`f0 @ `G `$@ @@ص @h@ @``@ 쀠`$@@0߁b@`$h  ` `? b `T㿐 Q`#X `2 QQ#@`u@` Qc@E c@`m#p  @`  , @"'#Q!Q3Q 'Q`@`@@`#"  @`uc `$``c`` @`l@`m#2Ԁ㿐Q `*#R`T @`)  @`O`  @` @`H V Ã(`bp 㿐`E6`?  ` @@ @&@` @ (@ @ @  @ &@@ @ @2 " &@ &@&@@    2E `?R $``6`E    -`@ "#@ #c8<@ <` <` <` @]<` `$$`$ $ 4`$$``  `c8`2@@.ܢRX`K'` %`%`%@  J -`@ ">#@&  @~ c8`$ @#c8<@ <` <` <` @<` `$$`$ $ 4`$$``  @ `ה   @R $$ $ $ ` #@`@ X -R,+Q`R` (#`@_9@_@_  $`@_ $`@_6b``@$`* @$@ @ "+'` @@^`R` @#˒`@_ `@@^ $$ $ `E #@`@(' ?R`H?. @^ǐ {@^ג  H-@`"@)-%8 S $$  ``$ 4 $@^  K$ `$ `@^`  +@` `$`  `$ 3`$$%@`"8`2@$Ԡ@b$ $%@`8*-%`#@`Q@^c!Ƞ@^c @^ncRR``p@Q#|@y Q@^L!Ƞ@^Zc`RQ`@nQ#i@e Q@^8!Ƞ@^FcRQ`ٖ@ cX`, X`, 㿐N b+  3  2N8 8`(` @ 0`(`@ @ (`0`  @ & @^`? `?@"@@ #"@ `2" #"D "D c8  Z* `,@  hh h h h h hh h h hhhhh h hhhhhhhhh h h h h h h h h h h hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh hhh hhhhhhhhh h h h h h h h h h h h h h h 㿐 `6 `JZZ `@]-v    ` #` aD@Z#`㿐@]Q   c8`#c8@$Z)@\ Z@]/!@]=cZZa8H@R $$ $ " " 㿐 `Pc8`#c8 Q"  2 " "" " @ QRbĘ  ;   `@    㿐c` c#b'L'H'P'T'X  7⸀`B3!"3&b0@\֐ /@b0 Z!P@Ȓ'@ /@P9"0@\Ɛ'@ @\ʐ eb`u7"0⸀@  @/@⸀@ ` @(`8`` `/@⸀@ ` ^/@` /@V`b0`"!K@b@ :@O@`@` "/@`@ *O@@/@b0 Z!P@z'@ /@9`  b " L`  ? 2L (`8`` d?&b0Z@\[!X?Z% @~ Z@\Q!@\_cZZa@t@\rZ!H@@\S7\`;13bLc@i +`1#@ -H``)@ `! 0$#(@xw'?9$X@mX  5T` @bP bP@\  s$&TbP  c, b9#b'" %H\@X?"fZ " b`"Sbf` @\"X b`@ bL`%H'bLbLc@ g 19%"""#@ # @ @  L` " ? :LbPbP 5"@gT"@]TbPzbP@#@T@" @&"'%"'"$ \@X?2 Z%@ Z@[}! @[c@c(@[s @ @[p` b`bLSbd`"ZbL`'bL3bd@[Z!Z @%Vc@bL`@[W L bPZ %@ T@&T 5 @[C $Z%@Z Z@[-!@[;cZZa@PT"@[T"" @#@#Z3bf@[!Z @8%c@c(1@[΀ Z@Z" jyy`` #"`&\;3" b !"P | bT#b b#b#(Z%$#(@ Z@Z֐" @Zc@`H` `5T`N@bLbP XbP@ZƐ W$&TbL#(`@`@ZbPbP +@bP,bP9 c,'"#c( bbL"` b8'bL`@`L#"`]&\Z %@Z@Z!@ZcZZa@@Z  bPZ %f@Z$"P9 c,@Zs Z ג%i 㿐#b!%@" $ #@  $b@Z[  $"  Z@ZQ $" Z & &@dZ@Z7!@ZEcZZbP`@Zb" @b؂@ #b$$x`0`V'⬀ b  ~?c`'cs`#)c"J `L'+b@  G% ̀@ @ ````` ''''''⬒@Z `?8`? "  ?;⬂@b '-ט ⬀  b   ,$ '?@` -# $# # # # ' "(@ @߂` "(@  "(@ 㿐%à`I#i?5 # 'c, @``0`!⬀ #b ?"L  ?E ? ߂ c,`$c,` '#@㿐RbĠ  :N ?3`@;`. @(`K@ @Y2`??㿐c8`#c8b " 2 $b :K c,` c,@2 c(" 㿐ؐ"" 㿐bȂ`#b@Xb# @c8`#c8@Âb, @ " @ " " " &`  R"  㿐c8`#c8"" "`#" *" 2 Ɠ@e"" "`#" *" 2 㿐@Xb#@ â* b@ "  @  2  " KL@ @@X 2 㿐А   `M,Z`1@X0-c   L N@     H H`$Y ^@XS 2 ؠ,@u Z@XH"p@u @ `@ (  `d`㿐Z $"Ȓ   ` 3Z`@bZ"  ` 3Z` b@m3Zc@XT@@XQ@XR1Z` ` "@ @XJ# 㿐+b@X*  Z ; bZc(@X= dZÚb  ,@$` ,`,bȀ@ZZ#X`@W*_T@X  Q+Z-Z/ZKbЃ, ` ch`M @W  ` `HUp㈒  `FK `G9 @ϮnܦZ*@ǐ Z@W!@WcbZZc@*@W#0 @Wc@Z@W#@bÂbЀ@Wǐ 2Z@W@@Wm#@W{c@q0@W@W`㿐èb , $' @$@@@`" ` `M`H  `F `G @= 00؃,` @( `d@㿐Öb  ,`` `Md? 2 `c,` V@(`@W 2Ðb   ,` "`  "` ` `M  " " " `  `c,``⸐@W&  @& @VZ+&@ Z@Vː!@VcZ[c@`@``@ 0㿐'Ā  bh``#bh  @V*  Ðb   ,` "`  "` ` `M  " " "`  `c,`Ā[Z `@V+\`bĖ⸐@V  @2 @`?``?@ ! P`   5[@-`@ ` @VE @@M@-``@Ӻ` @VN 2#cc@,[@V+ XZ @P+hc@0 Z+O@H Z@V! @V)cĖ@[[`x@;*Z @2+M[@V @2㿐@Ub#@ Ñ* b -)+ % @2`" KL @@V 2"$c8%"$$ %c8`4 $@Uځ㿐   㿐@Ub#@ '* @@U #`  2@U 6$$ $ @U $@U`2   `4 @$ 4#@`4 "  `+4 `(4 Z,:@ Z@Un!@U|c[[`@Z,8@ Z@U[!@Uic[[`@~ 㿐@UL @UQ% ` Z,@d Z@U7!@UEc[[`Д@Z$@@U<$`$ 㿐c(` J@`."'J`[ @U=c,[@U:!1’" "@ "`&""` (@`["`@U(!@UM"`J@`.[J``/[c,@U [@U? [@U!@U7"㿐     .  2 .R(`bĂ@``"8@`"Zbă(`@ ` $|aHc[a[3`؀)`Ā%`쀦qłbӂaxb`b܀"Mb`ah"aD$0) `P f& S[ `@` `Iw`G8X`F:`"3`*`"[@Te! `R@ bRap  `P" 7$  `"b`{c`"Z @g)[!P@T9@f `P & 2[b@ a $  )! *`8[  `@ `P $@ 2} `@ `# ub`"p[@S!Z)@ R@bRac@[ Yb`Sbn` c`"IZ @)[!Sbl`2 [3bl@SĐ!PZ @)c@v` `I+`$`& @ `I! $`"hc(`  `` J@`.[J``/"` @Sc,[@S!!’" "@} "`$"|"` (@`"`[@S!" "@i "`$"d"` (@`"`[@S"@S"`ZW#`b@) a O  )L  `Ib $`"b[h1"  [`$bb )- 6 )}@P [@S#"h@O@[3bn@S!Z @A)c@;["@S @~@S^ [@SZ [㷐`' b'?? "|š Ȃ!##' '' @:6&  ;`# `#@''(`@Rې   @Rݔ  ?@','@Rє`'@Rΐ  @@ڴ?Y@b.P@#"T||b|`Հa- Ya@ @ d@W@`~P@ @ TTb@`Tb @ #@+` ' `x-`at@`? `?@  ` ,YWb.`~T c '?V@S#`d@@R `R `쀦`ô>Rb|`^? b|`2q@` `2l@` `I2g^@aH#`  5``Tb<`TSb`T [3b@R"Z @("c@Tax @ T& @a+ & PzV d@ >W@`~P@ @ ZTT`PzwY2?#"| `@@Q0 b|1 cP@ `M`'|`?"| ôbb>'r`["#0CY?  '''0`;b " b (?'b)b#"%"`$b0q%b ##"$$b 9V0 cM` [$(@`@ $$@0  [ [w \ /"$? 2(@  bc`c '#@b` ["@#@'b[#@@Q4G$(@`"@  $$b À` "‚! bt!&$$#" rc,`#c,  `? `? b``0%"`$b0 " cbH@ ` `~w(`ct@c`c 'M @= ]t$ K@`[`k$@ g`@ 2dK``^2`_$ :"0` bc`c '#@b`H$"@D$@'b=$w(@? e $ \(@`@ 5$$(@`b ) b$#,`##,cP@ "ta+c !+`#"t#Tbx`2!+[@Pq#XZ &@c@ 4bx!+&$$$:"  & 0` bc`c ' @b   &b  &?'b & bt&$$#b = 0` bc`c ' @b   %b  %?'b % bt}&$$"  ~?"ta+ !+`#"t#Tbx`2!+[@O#XZ 'C$$#"- 9J` \? *$(@`@ $$ "   0` \ꀤ? $(@`b@ $$ۨ h؀?Ƹ $$#" =  ~ 0` bc`c ' @b   !b  !?'b ! bt&#,`##,!+ bt$$ b,!+"t$$a+#bj !+`#"t#Tbx`2!+[@Ox#XZ '2À _ b `I@  [#`? _ `?@"bt`$  Ö`I$$ `@ `?@ $' `@  _`? $(@`"@ $$0 ) 00 0&   `;"    Gؠ  H Ð 1   "       /ݸ` Sb`   Jc`˸Sb`2T [3b@N#@T J J 9   =b`2 ][  H  L   z `"b8`"`2\@Nh Z @#c@ =Za T[ NU HO BI <C 6= 07531 - @N/"        `-\@N X$  `Sb`  c`   Hs ;   Hj ;`Sb`  #`   HS ;ϔ ָ耠`42 ` ` `)"` `6¸PT #b,#"(  :`$ b`2T\@M T 8 ` n`Sb` B b<` L  ?{ b<`2 5\  7p w  3j qo mk ige (XT O[`"` `P" 2\DKb`2[  H L6=` `P"\)0 #* $`"` `P\ `@ `*`? "`"   $ !"`U$"  $ !"`;$" b   Ԑ@L JZ  ` Sb<`" I\\@L!b8R``R`@~c`#c#`'' \a\a  `H@`+ Ғ    ( + ( ~z +t `Ey` `=uT``"qT` `E2mT\@La!tfT b,`#b( b,#b(Z X V  ) IRL' )? FDB @> < : 8 ]60'U,*(  D " '! $$#bt Ð! bq&$$"pÀ`|"#"p btd&$$#b | ~ #`? &`?  }0b, EÀ  bb(`! !  btB&$$#" bt$$"  = <0` bc`c ' @b  b ?'bb` ^b` 2  ^ ^ bt&c`$$#b bt  2 $$"$(@`"@ $$?Ҁ`JKw(`bH@c`A `$@ !YÐ `IJ`0 `' bc`c ' @b b ?'b:à` bc`c ' @b  ?b ??'b? ]0` bc`c ' @b  $b $?'b$(@`@  $$#`Nb @}V G`b  `I@  O*8``x `?`X`?  3@J" @/}b ?@}ǔ a bb`$`3`$!! btG& 0 b$$0` c`c ' @b  b Â?'b `I@ * . . . bt&$$#" = -0` bc`c ' @b   -b  -?'b - bt&$$q#" =0` bc`c ' @b   /b  /?'b / bt&#@ `?@?0(` #?@  - + `I@ 00` bc`c ' @b  0b 0?'b0̀`$$ b =@ +80` bc`c ' @b   +b  +?'b + bty&$$#b = tc`0 *` bc`c ' @b   *b  *?'b * btP&b( b($$#"t bb(`$$#b(" bt$$#" = 10 À` "c`c ' @b  ! b ! ?'b! bt&$$"  = 0 À` "c`c ' @b   <b  <?'b < bt&$$l#" =ƀ >0` bc`c ' @b  b ?'bb,`b(` ! #bt @"‐! &\@I\!nb #`##ZbX V `-O'M @IF`  "G\K@`*.@c8 K#c8 P$  @~@$  @   $ $ 4 $"b`#b  F ^a@{ݔ a   `I2 $`2` !<    @H @} N"    %\ `` `P2 @Hh@z˒ ' b8#b<'c ,` "`-\'Z%)\`" V `"'  " ``" V `'@H@z,W@b`  b``#b #b<  $s !#`$#tc8 #c8 K$  ]$$  $W !"`z$"XV'T $` !<IG b8B#b<В ,5<:8] $b2 $4  b R  & -@H$ "Z $@  `,@Hc` #c bb`  b``3#b  b<#b8  $ !#`$# ) -ոӸ `A'耢 " `F"`H`*" $\@G"  H-   .@G"Ƞ@yƒ,[@  `c,`c ,`@G @G 2`c$,`TZ0` c`c '#@b` i"@i'bi`?s`? <!#c(`"&\\@GS#HZ @yx' cc(#,@%!\ #\#\L#h 0R@G0#Z @yU'c@!#,`@##,`"?` "]@G Z @y8!fc@ 2  ' P Zb@  M "%@F   %* bĂ`#b'xD?@G( ?@y a#"" $"@@{ٔ#b $`2 $`"!b$hb 2$`!! bt &b2\`WZ``K  H@퓒 0`$#`8#"8`"` "]@F| Z @x"c@ "g `' 'g  `' '^ ga'$+@`@$$D#" @FX#@ &b b$@FZ" ?0` bc`c ' @b  b ?'bb `8,`R(`Ă` ]@F Z @x;)c@]@F @Z @x+)c@]@E `Z @x)!c@b`R(`"Ă` a]@Eې @wc` R(`Ă@ ` $*c` RR"ă(`@ ` "Rbă(`@ `~׀`8L` b@EǐR"ă(`@ ` #bt&#bbH@`("!`!!T"`]!! bt&b #"p'b!+ bt!!+ `PJR`GH`I" $ @9  $h `  ?b @{ `#], @EX 2 @EV`i ,  . =`.`@EU #. $ $ @EUDT 7 >`$@  ]Z `"i@wTZ) @wK Z@E! @E,cb$b ]] @ a@w=$ ' b`T2N\]Z ֒-!'!' btX&!  #bt"‐! O&` bc`c ' @b  !,b !,?'b!, bt4& #͔ # `# Œ #$#˸]@D!@v˘ ŸT!(!( bt&! #bt #b #맔 " `# 럒 #$" #뙔 " `#  둒 #$"昸T攸T @v+]!X@D@v`% %w  `% %n wq'` `2e@@ 2a #` e@D[!0Z @v#+c@A@DN#@vX @DH @vR0]3b@DA!Z @vf!c@c`\#c@D0 b8R``R`R@v@b c`] c@D!@v6@D ȠZ @v<#Nc@@{i*@v/ Z@D!@Dc]]a    ,',@ @C@ 퀥]@Cې!в`@@u@C`T! #bt Ae b!#bt Ð!#b& `I@ $+@`$$O$+b  F b$D0B0` bc`c ' @b <0b 70?3'bc =;0` bc`c ' @b " b (?'b"|` ^ `#"|]@C\"Z @u'c@b]`"8@CK@uU ^"`  `#"]@C9"`Z @u^'c@b` ]@C("@u2 5"Z@uH"qZ@C!@C)c]]b.`@CǤ H`*2]@C"РZ @u(!Kc@b @B"(Z @u!Hc@h"t $@y"p $]@Bߐ!@tc  #ה " `#  ϒ #$"ո@urgҸT  ȸ0` b`c '#@b`"]c@B@B ! #bt !!#btߘ @(]'bɰ c,`#c,!+ bt+!+! #bt  b #"!%!% bt&@Bz!`@tv  5q x$ @y͐) #h # `# ` #$#f >#bt Ð >#b&_[T H KR @tq#]@BD#(@tq@B@ b8R``R`RJa @B1#@t;]@B,#H@t6 @B>! &(Z"`@tF Z@B!@B'c]]b"]3b@B #Z @t.#c@5 ` ` `)]Z#`@B!` F`?H`?  @*ϒ  `@ `*`? Œ  @A؀  ` @A耢   <$ @A@AT$$@A#Ӓ0$$  "'0` bc`c ' @b   _b (K ?'b _F ! bt&@A` 2! ]4"@A#Z @s)?c@!`T#Tbx`O[@Au#XZ @s)c@ ?4bx"^3b@Ab Z @s"9c@^^3b@AS HZ @sx"#c@oc`^ c@AB @s[J c`^ c@A8 H@sQ`  @sW+^ p@A4 +Z-@A.  2- $@AF@A   Z+@s4 Z@A!@Ac^^`+@s# Z@@!@Ac^]`ܖ %@s`$#Tbx`$[@@א#XZ @r(c@ 4bx@@?Z @r(c^ b @@@?Z @rܒ(^c  !#bt ^!!#btޘ ! #bt b`! b` !  ^#b@@!8@r! #bt֘ ^#b3!h"‚!&!& bt&` bc`c ' @b  b ?'bb,` b(`! #bt B! #bt CÐ! #b&\\\\\\\\\\\\\\\\\\\\\\\\\L\\\\\\\\\\\\\\\\\\\\\\\\\L,lt |$`,|||xh4Lh||\P||H,$|||||,LD<4d80`4,|||X0||||(|tlT,$xpX||x`H0hPx`X|\80(T |||$p㻐!Z"4aH`@?+ $"4"4$@?'  @>@>ϐ@> @>c^"@>a@> 㿐!"4`"Z@>Z @pŒ-^@pǐ!@>"4$"4㿐!’$#@>Ӗ\`9‚b&`2@` .@> ` (^!@p w^@>m!``# ^@>b"@pbȀ``0@>g^@>P"㿀 [^ `GB`I"! $@  $b` `;^ +? !$#@>#`"?@p ch@t[@qא!$#@>{#`"?^@>"x@p@pޕ c@ue? $`$@ @="P^!@p c@ $^"(@p 㿈 h "^ `GF`I"L $@  $(`0`h `  ?b " @t ` @T$`:' ?@p c@T\ 6?`2# ^`"^"@=@o$`41/ @pn c`$@ h"(`@s $ "$@=ư@q>'@=А"' `  ^@=o# @ox?$@q&1/Ͳ N`/^cX@= bЃ, 8``/^ch@= ؐb֐ ^"(@os 㿈  2 '@= `@ `?'@L' @= `@ `?@N' @=@ @=谤 @ @@ @Ӓ 㿈`^` `G`I"r`$@  @  `G`I" $@ b` `$`^ $`^`$h ` `?b " $@s  $h `  ?b "` @r`  `` S `(`, M`X/à?"H$@D0` LL `"` @= 2頄?` @,`h" @rȐ#' @`m?"$@8$NL@20` `0@< 0%` $`  $`' ?@o, c@p $`"'@p ' ?@o c`$@@ EF`$@ LMhK@rpF@<.#^!@nS!4c@G`$@"`'h X%@@9  %-@` `"@9 ^$@k!_@8!x_@8!D&__!@k!`@_ `''X"[֚ _`'``'```'`` '`'h`A,c@  $` ?8l @ |@ 8 ``? H``8 @9 8  @Ӗ , @ݒ?(8( @p``l `?L _`? @ @`_`'X`` `? 'D;``@Ч `@.H  ’bx`DH@ `2l`|\ @| 0.\"@@&| ``8H ````"P@'`'\"@' !@ `X %@@8 ~X @-@@ `'k @7 Һ@U %@@7  `2Z``?$@`+`;``/`9@*@ @;`@ ж $@+`;``/`9*@8 l;`` 'l`' @W*``ŀ/W  'l 'H `c``I @ `` + `+  *@ @:@ в3+  @ `*+ 8``$:P ]*#@  $` v@'`$@@2ʲ80`'lâ  `?L@'h_`'X ӛ,c@  $h `  ?lb @mTl`} ( ' c`{r '{'P&^#'@i !_@6!@i v'h`,c@  $` ? ! ! J !J L# ?``H??l` ``` !H`?`*+? 'd!_%^Ȕ"@7̀ Ȁ@"'Ȁ@ @`3'Ȁ &@6̀ 'Ȓ#@h_@6" @6c__bP`@hp`wb`/U`n_c` 'p '|b 'h ,c@  $` |?l` '@ ` @  @ @%@ t` @6@ @ %.` -.W*``|.| L #.L`H 0.H` * '. .......H`"#\b̀`2#\_@5 ^@#\@6Z %@  @@5ꨒ  `?L'h_`'Xj`U,c@  $ `` `@" @6.(@ ' t`b`/U`_c`$ ('tx`b`/U`_c` 'x@5@ '@ @ `X %@@5 X @-@@`'@5t݀ @5lꨒ _#@5}#H b̀`"`_@5P@'@P@5S ' @5T@@'@5O@ '\ ˜"x  @.šbx`D@ H``"ܮ `^D 'Dծ @ b`_ư g@5 # ^!@g0$c@ g@5 @lUD?8@5m8 @A?080e @ jP@(`c @ #'`c,@^!"@f_@4Ȑ" @4c__bPX@f@4Ɛ ' @4ǒ@@'@4@ q'\4`@ `4 @@ @'  '^!Œ$^!$Հ wȂ@¢bx 'D-^1_ @.H  DH@ `4l`"d\ "@ 0.\#@&d`4W9 -.`l`?L@ `?l@ @_`'X@ \'\"@'   `?@_`X@WN`-+``?@ `2-@ Ơ%@@4 ĺ-@'`' a@4q  #\c@4l 0@3 ' @3@@'@3@ ['\@k3@@k/?@k+?`  `@@k$ $@3̐ {'H?H#'d? 'd" { @.D@ H``"6 `@D`'D/  P@(`c @ ;' /P@(`c @ V' $P@}(`c @ '( `' ' P@d(`c @ '?'|'Lc.F 0_.`X ` 8%@@3A @` -@-`'`*``W.^!D$`P +`c @ '@3 ̨ @2"p^!@e#c@ 5@2"^!@e#c@ <5@2ݐ"Р^!@e#xc@ B5^!$ 0.^"\@d!_@2" @2c__bPX@d"@2 @2 ' @2@@'@2@ ;'\@2 _' @2@@'@2@ V'\^!$^!$9@d_#`@2s@d^"@d!_@2j" @2xc__bP@d`'H^"@d!_@2U" @2cc__bP@dx^a@do$d_@2Bb #@2O__bPc @db@2; ' @2<@@'@27@ r'\^!K$@2  ' @2!@@'@2@ '\@2  ' @2 @@'@2@ '\@1 ' @1@@'@1@ '\@1ې ' @1ܒ@@'@1א@ '\^!$y@c_@1" @1c__bPr ^!@c˒#_+#^!#$^!@c#|_ #^!@c#)` ^!@c#` @^!@c#%`  h^!@c#` ^!$^!#@1y B' @1z@@'@1u@ C'\^!ݒ#^!ْ#^!"^!ђ#A@1Q> ^!t$*$@ce@19" c^a@c[$i_@1.b c^!q$^!m$~^!i$^!@cD#6` ^!^$^!Z$^!V$͒# (Śxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx<(x<xxTx$x (((((((((xxxxxxxxxxxxxxxxxxxxxxxxxx,xxxxxxxxxx xxxxPxxxxDxx8㿐 "8^ `G,`I"  $@?  $(`0`h `  ?b @f    $`0h"(`@f $@d0`$@ Ԑ^"(@bw%㿀`  c`@b`E`0. €  b@V&쀢 :  6 "  #\`!   `"  $@a" $@0e` $`@cɐ0@0 ^!@b-%Hc@0 ^!@b$%K`@/ @b$㿈 `^ `GG`I"( $@  $b` `@` 0?耋 '`ah聪 `聠H @ ?@b chޘ@eٰ@09?@b c@/!@@a@ci`@g? $`$@ @/!^!@a%cc@ $^"(@a%a` "^ `G`I"| $@@  $(`0`h `  ?b " @e @  `Gހ`I" $@  $` `?%`H  -`F``cH?`)`#PЁ zH`cX 7ʑH' ` 20` #@' J?Ȁ`a/`"`$`"`$`@/!^!@a9%c@`$`X`$h"(`@e= $ "^ `G `I"! $@  $` ?`?Hȁl`H`2`$`chȁ7`$`@.ѐ!Ƞ^!%@`cȟ@`$?0`ޤ  a$```$`"Ð@bm@f  $`V?@bcS%`Ё H3])``@."^!@`%cП@M)``$@   `$@ #$H' H`P#P`cX7J'A` h ` @d0``0`$`` `@~  ???@.J@.N  ћ,`@  @@.?`?,$@cB  $`^2 $;ȁ H#``cP`@."Р^!@`9%c`cPcTȟ@#P@.!p^!@`'%cП@`@aH@eN? $`$@ ?` @d$   `c`H?Ȁh怈` @d`@c`$`l@ahH' ` @-!^!@_ے%cП@`$@-"P^!@_̒%cԟF`@-#^!Ē%@-"^!@_%cȟ@e`^"(@_%w^^"(@_%x^"(@_%^%@_!_@-i"  @-wc0@-g ``c0@@_㻈`cp@-U@-֐쀦   2C   `",^` `G䀠`I"`$@ `$b` `` @@ ' ` f " ^ `G`I" $@ؒ  $``"N a`(HI G `G`I" $@Ò %``$`(``@,#^!@_&c@`$(`0`h ` `? b @c` ````$`_ @b!0@ ` @-D, $-^/_;9a7a,@-7`,@(@, 2,&N@^@, @,c  @^hU@bĐP@, 2,&L@bD@,`g`$`c@`)_`$@ g0b@`< @c3`$`$@@ hT%@bP@`_@,E#^!@^j&c@p`$@,Ȑ@,4#^!@^Y&%c@`$@_i `$@   h @bV $^"(@^@&#^"(@^;&+㿈@,애?@^ה c8? ' `Gh`I"X $@  $b`+  aa+ 0`h `  ? b " @b  + #\#`#da`X @,V  + $`+`%  ????'''Д'?'@u' ?+h@a֐a!`p@_Oր``$@ @+ 0^!@]&rc@ $^^"(@]&p@^H c㿈@B  }^ `GE`I"3 $@$  $b`+  ]a+ 0`h `  ?Pb @a  " $L`2%  $`' ?@^ chӘ@akΰ@^' ?@] c`$@ @#(@@+Hb@=@+?: `b\` (@@+5b@=  (@@* x^!@]&c@ $^"(@]&㿀 ®b   @PՒ쀢  ˬ    `-`@*ؐ  ( 9; ^ `G{`I" $@|  $`m,`4 $ $`H$ $ `H`@K)  ޤ #)a1;#\,``   @^K@  <  #\bp&#\`@  #\bta  ޚa@@*~0W@^! $ `H`@2 ) b2#h ` @ " @` @]/ $ $@ h`@`v@]  c@]b @`$@*|0^"(@\Q&^&@\H!_@*" @*)caa`@\>㿀 ¤b   @O쀢 J F`,`", `b``$ 'a#\!a    Q`@  #\bt  D`@a0@5 @*`0@)Đ ^!@['c@ #\X- 0@ `@) q    ???k0@ $@9@) E???А%@@)؀`?8`?  ,@ ` 0A?"@ $?,@? `?2ꀦ@)kˤ ƀ@)۔?ٰ$@؀^!'M@[t_@)G" @)Uca_`X@[j^!'B$@@^K  $`2 $㿐 n^ `GU`I"1 $@  $b`+  Na+ 0`h `  ? b @_C`0`a F $`?0 h՘@_-а@^   `I : $ @` @)s,@\0`$@ @(Ȑ!^!@Z'c@ $^"(@Z'㿐 n^ `GU`I"1 $@l  $b`+  Na+ 0`h `  ? b @^ː`0`aΐ $`?0 h՘@^а@^>   `I : $ @` @),@\0`$@ @(P!(^!@Zu'c@ $^"(@Zo'㿀^ `GZ`I"<$@  @ ^ `GS`I"Y $@ b` $``aa $``Pa$` 1? $` '?$` $`@(?@Zϕ ch" @^2Ŵ@[@(?@Z c@[ $@_B?@_>?`$@ `$@ h@^@'Đ!^!@Y'c@$@'!P^!@Yܒ'c@ $^"(@Y֒'^"(@Yђ'㿈 G^ `G.`I" $@W  $b` `'a ?@(-  ?@ZR ch@]@[1@ZF c@^͐ $`$@ Ӑ԰@'b!^!@Y'c@ $^"(@Y'㿈 G^ `G.`I" $@  $b` `'a ?@'  ?@Z ch@]e@Z@Y c@^} $`$@ Ӑ԰@'!ؠ^!@Y7'c@ $^"(@Y1'㿈31bܔ!#( ` c@_@'c'애ab?@Y@`&b@`#(@_m@'c'애ab?@Y㿈53`b.'쀦 ] _^ `G9`I"? $@  $b` `9a #b@'@_$ $`쑠 ?@Yu c!#(!@_ΐ &@`<#(̀ @ZQ쑠 ?@Yc c@]߁@`$@ Ȑɰhǘ@\°@&x"^!@X(c@ $@& @_B&b^"(@X(  U'p `G(`I" $@  $(`0`h `  ?b " @\ @b;  ' '|  `H0'|   @a  'x ( $@"'t'`0`4x| 'xb@     'l $-@   (@ #@ `@ ``0` +`@ -   @`@[ ' ?@X c ó|"ab0@%@%ؐ`p`p@ `@%Ւ "^@%Ԑ@l@%ϔ@ s, a r, , 'p t, , , ' sabH? a@Xu@[f m|"@%l@% l, e n, ,  g h, , , , '`E ? a@XN@[?|F "  *f $@% A@%z$`"f!@Y b!Àh"(`@[ $@%\ 2^(p@Wr_@%E  @%S#aab8H@WhabxJabxH`$@ ؐ?'x't$`"*!0@%*Y @[`xt@ +`(`@   @ `''t'x(r^^"(@W1(2^!@W((:a@$"P@W("x@X@x ?`"x`@WŔ a!"$@@X@t" ?@W a$@`@W c08`?''H'D'@`D`@'L'D ''' `G'`I"R $@ $h ` ?b "'@Z 'D`@'D А `G `I" $@b  $h `  ?b @Z` ` @` ?" `$`$@` ( `$`$`abh"$@Z`I '`G@i '`$```4`$@W '` `' @ `@$V u& ,(``0`'Ϛ @ @x`Ic+a1a`0`Ԁ " $ H@ `"L ,`8``\L  Ú ''`$@`(`@ %%@@$ &@`  '@$ 8.  * H `?@ `?@ "xL`& ,`8`\H.  *L '#@H@  @ f 3``?@^`%@ @_4 ?V '`$@ ܖ0`$@ h" $@YȐ $@WD a`0` ".$ H@ `2.L`m  I@ `" + 8`@`(@`$`@ @ .   *   L`&6 `?6'`$@ '@#P M^!:)`0`$ H@ `e,`:h  .  :g .  @`#@ @. Z`` @`"&?' c`)aL `& `?`\`? "3.  /.,L `& `?`\`? "Ӡ ?Ϡ :'@Vk . b@#  Za.  &.    dy0qb@#   Y? @"ː '      ???Ѐ@  x؂$?`??@"8`? `?    ? +@[  ? ??Вb@"  ".L `&2..  3 "@"  2L  '?I ?'' :m  .  `&28 f?&% @` @d`@"P 8@.  8 .@"I`&'`'` @T`$7`$`$`3: @ 0`@ @ " `1`)@"$  ?]^!)@T,_@!" @" caabH@T"@UZ& @@U @@!^^"(@T)^^"(@T)^);@S!_@!ː" @!caabH@S^)I@S!_@!" @!caab@Sۖ@T c?c  c     ????? @?`?`?`?` ?' `G`I"b$@=  @ "^ `G`I" $@.  $(`0`h `  ?b @W @Vl  $`u`@?x`?`?`?` ?$x''x`*  ` H@`g `?`G `? ? r  &F  $`"s $0'h" @WU` Uab  ac H#a$ޒ@T  $`"L $@TH $ab ,@'ac Ha@ "@R$@T`$@ Z\`$@ aah"`(`@W[ $c@Xa@X$^^"(@R*4^"(@Rے*6`6 $㿈@27  @ . 6` `@ c?@Sg6  @ߒ @?@S] c㿀`^` `G`I"`$@<  @ ^ `G`I" $@- #b` `$``a $``a`$` o@? $` e?b`"C`$b`(聪 ~ {aW聨 H aP Jba@ 0#^!@RU*c@b`0a@ #^!@R>*c@`$`& $`@ w @ s @% P h" @V/z@WL?@WH?@S0@S $`$@@ bc`$@ ijhh#@V ca@Ɛ#h^!@Q*c@0x@#8^!@Qے*c@R`$@#^!@QΒ*c@A $^"(@QȒ*^"(@QÒ*㿀`^` `G`I"`$@I  @ ^ `G`I" $@: #b` `$``b $``b`$` o@? $` e?b`"C`$baX聪 ~ {bd聨 H b] Jbb@= ؠ^!@Qb*c@ba`b@&!^!@QK+c@`$`& $`@ @ @ ] h" @U<z@VY?@VU?@R0@R $`$@@ bc`$@ ijhh#@Ucb@Ӑ ^!@P*c@0x@Ð h^!@P*c@R`$@ 8^!@Pے*c@A $^"(@PՒ*^"(@PВ*㿀`^` `G`I"l`$@V  @ ^ `G`I" $@G #b` `$``b $``b`$` T@? $` J?b`",`$bb@聪 l ibq聨 H bj J3`$b@J"^!@Po+$c@`$`+ $`@ @@ h" @Td@U?@U}?@Qؐ@ @@ j@Q̐ $`$@@ tu`$@ {|hz#@T5ub@!Ƞ^!@P+"c@0@!^!@P+c@d`$@Ր!h^!@O+c@S $^"(@O+^"(@O+㿀`^` `G`I"l`$@u  @ ^ `G`I" $@f #b` `$``b $``b`$` T@? $` J?b`",`$bc聪 l ib聨 H b J3`$b@i"ؠ^!@O+Hc@`$`+ $`@ @@ h" @S@T?@T?@P@ @@ @P $`$@@ tu`$@ {|hz#@STub@"^!@O6+Fc@0@"p^!@O&+@c@d`$@"H^!@O+>c@S $^"(@O+:^"(@O+;㿀`^` `G`I"l`$@  @ ^ `G`I" $@ #b` `$``b $``b`$` T@? $` J?b`",`$bc聪 l ib聨 H b J3`$b@#^!@N+lc@`$`+ $`@ @@ Áh" @R@S?@S?@P@ @@ @P  $`$@@ tu`$@ {|hz#@Rsub@0#x^!@NU+jc@0@ #H^!@NE+dc@d`$@#^!@N8+bc@S $^"(@N2+^^"(@N-+_㿈 z^ `G@`I". $@  $3b`` ``Zb` )?耋` b`c` :c聨 H c@?: :` hؚ@QӰ@O{b@S? $`$@ °@ X^!@Mђ+c@@: :`@ ^!@M+c@0@#^!@M+c@ $^"(@M+㿈N`0c`.N`0 @ !.*V+`*``4*8`c`'쑢H애 J  I@ ⁠*N `x `?`X`? "N`**+ "Ё*NЀ`6(`c(@ *8`(`;`c`'쑢H애 J 䲆*8`Ƀ*8`Ёssssssssssqqqqqqqssssssqqqqqqqqqqqqqqqqqqqqqqqqqqrrrrrrĝ㿈 D^ `G3`I" $@  $+`0```` ?耋`@M ch@Pb@L   $` @R $@N_@Mt c`$@ ΐϰ ? $^"(@L+㿐 e  "\^ `GD`I"; $@?  $(`0`h `  ?b c@Pca   - ^0`@ 8`, @`@Q ?$^,9@Ls!c@F!@@Lsh"ʃ(`@P} $`$@ @?^ $`" @M^"(@LS,%㿐  `G]`I"T $@ْ $h ` ?kb h @PB   `e  "w^ `GA`I"d $@  $(`0`h `  ?b @P    + @`$`-  $`3@ʐ@Oh"$@O`$@ 0`$@ $@``$`װ@MaԀ    ` b@MT@@O]h"(`@O $^^"(@K,X^"(@K,`㿈   `G`I" $@6 $h ` ?b  @O  @  `G`I" $@ $h ` ?b  @O  `@ ؚ `G`I" $@ `$` i@?@cap 7Qȁ@' `` S  "^ `Gg`I" $@ђ  $(`0`h `  ?b @O9    X @$`Z$`\  $`]@ߐ@Nh"i$@OdH' @ ``  b@P" ?`$@ L0G`$@ e0``$@ 0z`$@ h"S$@NN@O$`@LM$`" @LG ' E @L?@@NHh"M`$@NHh"j(`@Ne $^^"(@J,^^"(@J,^^"(@J,^"(@J,㿐b    `GY`I"P $@  $h ` ?]b  @Ns ` `2`  # "_^ `G:`I"L $@  $(`0`h `  ?b @NL @ƒ`$`#  $`"@@Mœh"$@N3`$@ 0`$@ Ɛ@Kހ  @K@ݐ@Mh"(`@N $^^"(@I,^"(@I,㿐@c "@@S㿐@c "@@S㿐@c "@@S2  +  *@  @2 +   @ +@@ "@ 2 +   @ (@+@"@ "@ "` "` "`  "` "` "` "`" "" " " " " "  +  8  " 㿐#``` `. @@i    @``  @ & `@ @ 6@ $ *`$```@. #`   `#` `+`㿐``Â`I`` 0@y@u㿐!  Д 3  `̀ 6 # Ѐ`@(   $&`&`&`$ Ё㿈#`!`%? @R`ഐ@1 $  $  @@$ $$ K@'Â`I  Â`I  Â`I  Â`I  Â`I  Â`I  Â`I  Â`I  Â`I  WÂ`I  Â`I   `? `?@㾰  ) `#+à`H " 2;`@` $` '``Ѐ`?`r(`b@`3` `@h.``# Â`I` #`7` "`Ő! ``d܃0```@  `!  `! -bʃ3` ``@` `@%` @@ ??"ݒ K@?Ѐ`  @(`8`Ѓ*@ @@ К`퀣@ ` nâ`I ~ W `@  _`? " 7 {` w! `!n` j! `y!a``  aa V!#`e!M`Hb`d!(#``@";`UU ``d63``@3` `,!  `;! #````!  `+! `3` ``@ऀ @?"घ! `#`!`0` ``@``#`  `! `!` ! `!-  `"!```H@`)! @T ``H@`|ݚ!h ``H@Ѐ` `d3``@` `! `!` ! `!` ! `!` {!#`# !p`Hb #`B `d`Hb`8}``@ `'`% ^b'ö`H50 [ \ `y!c`8``@ `'`-g% `!c`8``@ ` ]W'` \%  `%c`8`` @ `?`'`%  ]9 ]`"0` ! ` ! `c¤ @  `Ő`a"`'`Ȁ]@" ?@"@P  ``u cb4`o  b4,`d@ @ @+` 2`  "  `D `!c`8``@ `'`4% ` [/( - /*@  ]/)/+/,/- @p( a] @// @ 2  `2 $`2 x @" ?@"@O}   ` `` X!c`8P``@ `'`% @d]@f ߚ?@a@OS@["@OM% `' ``Ē`!c@E" Ԛ?@@"@O2`H`V`Hb`8N`` @% ` '`'* ``K@`\2K``)@ K@`}@ 2@c@8 @ 0`  @ % `($`H "`/``@ `?'` G% $`#``@ `?'` <% +`@ @@$ `2 b!c@Ґ" a?@͐"@N b ` `@" "9?@"@N``K@`\K``|c@"@N ,'$@ \c@"@N `,`Hb`$``@ `'`% }c@"@Nt#`` `l!  `@! ? `;?@ "O K@`,2J `@ "K@?Ѐ` A @(`8``Ѓ*`@ @@ К`@P@`'`@K@ @` % !c@@" r@;"@N-`/``@ `'`% !#`# !% `@ " "?@"@N #``0``4@ &`  @ @ 6@ @ @ $ 4*`] ,$ ,``0@  `+ `, `0D @1c$`$`$`$`,$`$$`$` $`$`$`($` @"   ^     %@ [- \>@א"`-^?`]`@& @6`,$````*#@ %$``]٠! `!``@"`̀`H?̠ [0``"@5 `@& $`@6`ޓ,$``$``*@ @$@s" ] \i@i"2 ` $` / $` `@& `@6`-$```* #@ @6`/ $````*#@ ~$`@Ԑ @Ɛ u`]@ʐ @ k`]@ L@`@ @6`g-$``*` @ @ 0@`@ @6`O/ $```*#@7$`@W3$ `!c@" q?@ݐ"@L`H!c@֐" e?@ѐ"@Là`H " ` `۠`H "`(`` `@ `?'`% ' ?'$`#``@ `?'` % ଃ+`@ @@$ `2 b!c@" "?@"@L b `# Q? "   `l`` @ #@ '`% @  `]`k `!c@e" ?@`"@LR̂`H :`? .`?  =  + `` @` @'`%`  4/P (` ` @2"@L$ K@`]퀣  (`?` ` @(``8``]'`@"@L :=`?.`? 2B 1? ```c@"!଀`W@6Uc@"@KN!c@" x?@"@K֠`H " `?@ڐ"%@@?`@;`? `@P=!.2?`2`, $`( `,`@ ` @@6@`(.`$`(`,``((`#@$`,ˠ?2`$ $`  `$`@ ` @6` .$` `$`` (`#@$`$?#`P?``Pcc@u  [cc@n [`ha'P7T@0 $`  ` @ + @6` .$` `+ ` @  $`t?`@& `@6,`$``` [*" +`" $` DDDDDDDDDDDDDDDDDDDDDDDDDDDX`DD DDDDDDDDDDDDDDDD@DDDDDDDDDDDDDDDDDDDDDDDtDDDTDDDDDDDDDDDDDDDDDDDDDDDȝ㿐bP`+#```$@ ! @ @ 6@ $ $*` ($ (!S E`````(+   `И@ `?` @`"@ ```@ ` @ @ 6@ $ *` $ ` +``? @ # *bD@```#```#``` @ &# 0``((` #``0(`+`(# 㿐`. ` @ a a ~`0  $@? 㿐 ä`H. # `` L@ ` ` @a  ((`@@  㿐@7! @  @ @)%!  @  @ 㿐! 䀠a V$ 䀦 !!  䀠a p+`䀠a@ a  @ daba`a^a\aZaXaVaTaRaarܐ!+`>` /%`>`}! J`)` `M#%`D   W!    J!!   %``>`̀! 0D`bP`%`! Ѐ`  4+~`|!  Ѐ`%`t!p! %%`T `䀠ac@ # @I%`T!R!P! 0㿐 `? ` #` `#` ` @ u  @ < @ cc0@ g  ?c@  :c  @ [@ bP #` `#`"# # # # # ``"*cN!$  `  䀠" c@ #X@H 8!  ``0c8@ $  "Ɛ @  2  @ #@@H0ِ! `& 㿐 ` @.&@@  ` @4.#㿀`  @@ .@*$ @.@" '쀧@'&`@.' '&' `@?0 @' 㿐& ` 2 ``X@ @(`&`'``#` @  @ D@ +`+ &(`&`'``#  @ 4  @ >+ .&`' #  @ 40*(`& ``/ #` @' `Ԙ $ +`.&`' #` @ 4 㿐@ @ `    @. @ @ @  `<1 `8,@2 2 J @2 J @2   @, @`  @@  , 2ְ 0`@ &`8@ (`"@$`@*``8$`8.  @(`$`* `8$ @ʒ``8@(` `8@+` `8@(``8@+``8@ ` `` `  $`<@,  (`` @`a2 `8@ ?(``8@  +`` 4@`<`b$`< A` @,2  @19 9    "`8`8@ `+``8@ `2`@@ (`` @"`#  2`8Ԁ @    2`8̀ 퀤 "`8  2`82ǀ ŀ 2`8ဤ2`82`8򀤠x`* ``  *`$``@ *`  *` ` , @   !@ "S`!O!"N`4L`' `'' '`'܀  * ?  *(` `0 $ *@~` *(`b@`'*`D `` ؃,  @'?ؐ(``D  `@, ? ` 40& & `" ` `  *`'`'`'`'`'@ 8` & H^* ' Z* ' V* ' (` @N* ' J* ' (` Ĩ@B*  `  -$ @- 0* '   & D , -`(`a@a`?' %'@ ?%% && D$ -$@ ` 4 ,  -@   !`? !!-$- DՐ D`䀣@ & 4 '` ؃-'`'ܐ@-䀢 ׬ ` `0` `0@ 2  ɂ '`'1 -` D*`@ +` @ &+` @$ ,` @ 6 D,`*`$ D*`@ `@ճ-` a k i'? '%a'@@ '@%?` ?`"'? '?N?'+`'@ 0 -` D*`@ +` @ &+` @$ ,` @ 6 D,`*`0$ D*`@ A`ճ-`?`"@ '?`%?` '?? *`$# D(`?`+  @-`$  `+ % & @& <ڐ & 8 ̐@@@@@@@,,,,,,,,\?bȝ`h`??c\X@ @"" #`hà`I `9 @`@ `_`? `(``$ @9 `H%?خǐ.  @`8. @ ``C P@T#@@ @<8@##@. @-`  ? %T(`` @ "!>`? `"' ? @@:`~ `8?<*@``@а `2* !?#%`,* #`H%` ?`8``  ` ``` `3``0`3 @  2 4?c`*  `    ?c   Ö`I @ ``_@ `? -```& 9 (`&?c\@ @@ ?ccHcD@ @#? ?c4c0,@@9#@ @"?#H-`# @x`1 c`D cx x-@+` `` c|ccx@(`, @ @ %`%Ȓx@(``D `@4xx@ؚÂHb`(!`H?#H?cX @`#@ ?? c``( -+` `-`H`-?Ú`H b?`X`? `?@"#,`8`` cc#cc-`@ %@ `%m`8`@-?#, A  ?cH@@`` ?c`` `0` `0@   4?#0?  ( -@ #-?cD@@  `Ӧ ǐ?c4@#@? `I@  -&   8:@`  _@ +  `@ `?@+  +   &ܞ?#, ?#,#?c0@@` ?c0@#@?c4@@` ?c4@ @?\`@ ? @ ߠ@X?c\@`@@  !?-```&-```&??# ?cT@@` ?P`8@ H` `  ??#9  `8?cP@?@T@ H` `$`@?c #h H-@  @ " ?cP@?@T@ H` ``?c #h (-  +@" ?cP@?@T@ H` ``?c #h (-@  @ " ?c `  `@`"??\  t*@?@ c@cl9?"#Lc@?#p#@  c?#\` R (`` @ c#pc? -ch@  @ # `  ?< ?,@?@ cc  chct  (@ +@`# #   ?<x?+  @ @ ?L `  "?c\@@ 2,`8??+`#Ȓ 혐?#`Z* ?#8 #8#8?#\" ?#\?T#?c8@@" `?c8@#@* @@ ??cؐ!@e ?``߀`$* $ `8K& ?c   5??cD@@  '@#=:`* ?#8?c\@#8@+` ?c\@@`?c\@ @?8?8"?#@ ?#@V#??H`۬ ?#  `` ` 0` `@   4??X ["!?#@y#@v㿐`Pc. `L` ,`T@``\@`@4,&`P . `%@&`P+```. `8# K` ` ``%@(`H` ```"%@`#%@(`H` `w``@%@(`H` `y``"%@`#%@(`H` `_``@%@(`H` `g```#C$ `L,@ @ *  @ &`L@ @ 6@ *``:`X `L&`X&`T*`3`\&`\`L*`.``&```L*`)`d`L@ &`d`T`\, #@ @#қ, (`@`d#@ %@?+ *`8$@ @ ``"`T`\``t` @`\ @`LZ@`r``@`T @`L @㿐 L@)@ @(`& L` X  L& X& T*` \& \ L*` `& ` L*` d L & d \ T, #@ #㿐  #@ `2! 2&.` T@ ` `6 \`  (`@`  &(`@ `؛. `@ Ѣ @ 2 _" .`"(` 8H` @ @ `` *@  "(`H` @ @@*@  (+` 8`@@+` , `Ԯ`? `   ` ,` @@ ` @,`) ܴp@@( $`  ,`@@ ܒ@@( @@ i` $@4  ,` #,` (@@ ܒ@@n( (@@t N` ,뀠@``I  @a t_t  `'X'l'd'\ X`,` @ '` @ 'h@Q `h@J  @,`     ,` @`,``?   ``@  㿀.`#@+` 8@`꒑*  8``q 9  aZ`@d,`  '(` @a'?` @`؃. @ ,   `@<  `%  @Ԑ 2  _"  8H` @ @ ``/@ 䀋"  H` @ @@/@ %@`@0?,%@ 8 `@ɂ %@㿀! "`@   '' *`&T@*` @ (` 8 Q.` 8%(` ``>  `@5,  `,@(` D`` %(``(`.@ @ '`' 8`(` D`@`@ϖ`?@ @@l0%(` 8``" ܔ @  8x.`#@+` 8@ `  `ܔ%   ,`@@`@,``?`?@" ܀ "`@%'T* 'ؚ39 ܂ @ @ ;`؃(`@@ `?0'[ @@g'ܔ  @A,``@<؃,`@" 2`ܙ*`# (` 8`,`@(` D``  " (``+`.` @ @ '`'2ܗ*`" (` 8`+` D ``@" ؂" ܂ @ `؃(`@@Z `?ː' @@&'@m`g&܁㿀`l``'P'T'X/ #`lÒ`I  l `_@ `? `?*  @ "  l(` #`L`9 `T.bP`  `H`l `X,`,`5!3/,` @(``8@` Z` '' ``  `ܖ&؃*` Ԁ}'ǐ`T,`쀦80``?@ BT`\,`@ <T(```@  2uX `  ` ,`(`-  ^ (`,`  2Ѐ`/'(`,` 80``?@ 2`\T@ `?@?瀣@H8L `Kk`T ``  `ܖ&؃*` Ԁ*@ @ ?@ `?P@ @G `d- C@z` ,` @(``8@K` @ X#@ `0xT@`#@ `( @q`@n`~ & `"`癐 7&ԑ, 甐 9'  $ `' ` ` ` `` %     (@ؐ? @ @@  @ F 8(@ ?@(@؃, #@%`L%`P H  %`X%`T B`L%`\`LM* %```LI* %`d '`T@`@`0N@@ @(`8`#+@ `@㿐 &  && &  & & & & & bP`   & $& (& 4& 0 0& ,& l& H& L& h& X& \& d& `㿐@@ bP`^ <`   8@@` 8@```@` <@4 8@ 8   , D `7,@ D L  T,@ ` \@ `|4 T X  \  d } ` u h  @m @k 2 0w@e ɀ@` ( 0`<   ,@` E` =` 5` -`$`  ` , @A@  `$@4` ` 5`,`  `(, @0@  `,@4`(`(   0@ɦ0@  ,c <@`$@`@`@` @  L@ 0@`,@ h@ `@| d@t \㿐`  @ ` @`@ΐ@ @ @ @0@` 㿐@ @  N`2  c㿐 `   @&`,``㿐 I ǐ A.@`    0. `2 `  ,``". "`@c . && `2.@K   & ` @J 㿐`?`?@ @`  @@@` ,`@`   (@+@+a4㿀 b* '@  '` 9 `p`p` ``,`&` ` ` ` ' @ ,`&@ $ @ $ @ߐ ``A$  `> `: "9K*(@+@` @ ,'` + @! "~@?!!@!? ? !  !`? !r``'耠@ ت`K``` ,`   ``@6,`@G!! _ ! ƀ? @@8@ %@`J`"` `H@`,` H@`2D`` H@`2``(@`p` %`` J`"*` J@` *` (@?``` (@+@+` ``(`+`*@`   %@쀠@` @ 24` `K` J@2 +`K`"+J@"`+@`@ @ %` KJ?@?`@ &K (@ "@ $ @`h$ 9'`h $ *  @ *  `* @`?`?@@  %@`Y'`M +` @`?`?@@  |% (``$ 8`@Y  L`L@  J "?`@8  @G  2+` @(``8` Q5ѐ@qɶ.`2@`'(`@`2@@Z@%@ǒ "ڠ Ң`L@ "€@J Z %` } N` @!@%@@/@`2` 6` %`z쀠@w`  @@쀤`',``@ \ X'㿐'@ @ @"@ 9c  #$@ߐĐ& & & & &  $`I.  @ @` @:.@#@6 ǀ㿐b`S`` c`\c`Yc `Gc`I"q$@}9 $(`0`h ` ?b "@0@:! "wc @`"~c` `GD`I"``$@} `$(`0`h ` `?b @0y@` "ac$``$`"f0 c`c c@%#@,>@-ݐV@-ِ`$`$@ `$@@ h(`@0Bc3`@#ؠc#@,# >c@kh(`@0,c#@, F M@,#c@#@@, c#@, P U@+#d@А @@+`Ȁ cN` c#@+ id@ `@+ Ò`I+ <``?_ @ @ @ `2: ``?@ *c (`` ߐ (@` `M `` `Jb`d0l, c#@+ }d @q@+c n@+#d@h <`@+  ('d0@e@]`@ @_ t.@Z "]c @6#'d@K0,`$@A`@ #c8 5$c8 $c8b *$ 4 $4 $  #$$c8 J" c c"2" " M" 0H@ c#@+5 xc@0;@+@+Πc#@+# td!8#@+ d!` @+#d@!@cddaȔ@+ c @+#d@א!@cddaȔ@*㿐@p7`$ V @ @  @ Û.`bp  `T" `F`H`?`?   㿐Ӡ "T  `F`I`H2 c2"0c#@* d!I @{@ 0!@ c#@* d"0#@* d"X@h@*`c @*#d@^"T @*  b`$#b `? `?@㿐@O !À , ` $"b@ $ a8  ` `2$8` a@@"8$"@+ 8` a@@*"d W@*:"d@ "@cddc @*0  $@:@`:``:``:`` :` `$d2`$  `,㿐% *. @` )$)!`6#'$c8@:`: `: `: ` , :  " @ c8`2@*g. @ʒ`ـ d j@)ߐ"d@"@cddc0 @)Ֆ`%!㿐a `.  $0`$ ` ` 㿐%@ $h `  ?b '@-' ?€ # b`)+%#8a@:`: `: `: ` :    @, @+@#8`2@)aa<`$!!@@+ #a<b@ $`!@`2 $$@*&$  `,㿐#a `.!#a @ a @#a @! !@+a *$a !@9 @)!#`@*@c8 <#c8@a 耢 @"  $!"$a  @"#@))!d! @)"d@"@cddc@P@)a d @)"d@ڐ"@cddc@P@("!"  " ?" `" @ I$" 2 $㿐'`v``@ $` c@$` pa \%@,``m  WU)+-%c8@:`: `: `: ` :    B @?` , @*>@c8`2@)! DB)+-%c8@:`: `: `: ` :    / @`, , @*@c8`2@(@-@a%b``$dd#Xb@c!Ed"@(c!Jd@6#h@(c `,x+`0`@a\  ??? 8@`  c`0ä"$@ @1 ? ( $@@ 2>`0`N  $@@ @ @2S ]&@b`ѤL `? `? H  :L `? `? 2  "  "@ (@   @@؂ `?8`? 2  ?`?`?@" $@@&@2| 㿐 8@` a@ \\ `@ ,8:7,@L `? `? C  :),@L `? `? 2  " L @  @  "  L @  @  ,@&@ @@@&@ $ @",@ р 㿐 8@` a@ \G `: ,2,@:/,@L` `?` `? 2 :",@L` @ ` @   L` @ ` @ 2  $ @Ӡ ,@ &@ @@@&@x 8@` a@ \C`0`2  ???$@؀  @ @"-&@@  8`??`?@  `?`?@ @۠@    @ @2 &@x-0`@a\  ??? 8@` Y c`2G @9 @(`=`,@ؤ0`3L=`@" $@@ `?8`?  ? `?`?@" L@ $@" ,@ 0,@&@L@2  `  @ ,@&@㿐 8@` a@ \")!. @ $@@.  !@`2 &@"&@&@㿈 ɀ`9 ,`1;b`?C b@ $h  `  ?b b`@)b`` 1!ǃ,` @$h ` "@" @) `b`@?88` @ )-b` @ 1 ,`@%@ @ ``b`@``ה`b`@ @(|  b`@D ,`@` "8c8 #c8 `$d2@a@<`< `< `< ` < ` $  $``"   $``@ 4 $< $ @&@ $ @# @` `b`@  @&@   @' ,`a &@  `,%@ ;b`@6`aa@ 'b` aÃ,``@ `1[) @ !8 "#@ #\a4a@a`ؐ!8 @` `@ !8@ i$c@"Ȣ@-L @ G@-K <`< `< `< ` <  $4 $ $ @&d@ $ @}#dd#b@ v @)`@%8B @`%!8@ a8 " @ #\a4aa@#a8` a?'b`dd#Xb@ }t%b`d @$"d@\"@jcddc@$㿈 @'a $`2 $' ?@% c "㿀 D  `GҀ`I"D $@t  $(`0`h `  ?b " @(V @ޒ  `H' ` `($` `  "#d `G`I" $@t  $`e`H@$ c0h"(`@(# $ `"& a4c@c`2 b@ $h  `  ?b @'/a  "d `G`I"^ $@tt  $(`0`h `  ?b " @' `TbÀ``<Sa$` $`b`4$$`a`$`c`4`$`$`c!#\'b, @#' ?@$; c@% @%`$@ ..h"(`@' $h[`@'V $` ` H@À` ac€`ba@b@--$`@$$`@$`$`@$`$`@$Ր0@$Ґ `$@ \\@$0`$@   d3a$@#d"@# #Yc@d$dd#@##3d"@##7e@ @#d#@# #Qd#@##Da4c@ `?㿐!"`@@& "@@&@g{㿀`` !!(`#% 'b@ ` " @$[!(b@!( $` `2 $$@$N,l@, $` `2 $% $ a< -/b@! $h $"`  ?b @&c`"  b`< #%4Sa0`2` e3a0@N Pd"@"s$ c@` (b`eb%4`"` `)'O`4b@ a%!$ ` `8e O0c`28c€`b‚a@` `%4`H@` `\ʂa %#P!'@+ )@+!%!$ u$@"%j@"X$4b@ea $a %4`H@ a\ e`@ؐ`@` +,`(l@ ` " @` %` `(`e )!#@-4c@@^ )/@ @!fb@  @)$ @ @) `(`%!a b#@_%4@+S @+Q!$%!K$ a a+$"'79/7$"`   @)c`$ ` @)^ `(`%!a 8#@`]'/` a'7' 㿈b`SaD`~ c```b@ $c@( #a4   ?b -@%Z-` p/ @a 9d+7e쀥 &L@@ %쀢 Y@ *` $r"L@ 2` -f $%c@є c`TL  JH,#@L@ 2` æ` ,@ ?ee ` `0Ge3aD@!d"@ #c@x א#|@*` @*  %d"@ Ȓ#d@"c"ؒ#@ @@ "#@ #d@"c@eea(@ *bc?#c  @ 㿐@Q /  ?㿐  @u@A?Sb`-PaH`2`aL``<@  @ "`8`Xtr$`L`XP`8:4g`<T PaH`"뚒]`<e3b@!P "`e@a`    `I @ `"`+  1!L(`@; @ @ &!L  +  5!L@ `0aH`<@  @ 2`X`8%!L`X`<`  2`"8@@}"쀠` e@3@$$  W@'#@@f"0㿈#caP%$ $aP#\aP$   bd#b  ́b ́b 㿈#\Ϛ ́b 㿈#\ `@H bh`@H bd㿐 o `̂1‚` &#`$` $``$`@$`$`] @"`@@"`@ @ݐ"`@" @ݐ `Ȁ`-2e`̀`2#8```1 @  `@  @  @=@  @@`$``̀` 8`?@Ԁ@鄐8@h#@w#`@l@`́f-c`㿐ax " @R   @a  2 㿐b` SbX`. ax` `23˜b?``-f` "`  "`@ ` ` 2``@$@%@_$ f`'$`ff3bX@!0f!@'#<c@f!@#Tf@!@@!@@`ۀ`㿐%$@/" B @)"Ѐ 2fax` @`"` `` ` `2@ 23?01@ "` f@`!fa!f" @諰 @`@` @蠐!@@Ȱ f@蕐"@@@ 㿐N `b$ N r"H@ a w"H@ff"h@$fH@`+! ! `+ `?`w`?   ނ `+ `?`r`? ##ʐN`-(c`@A!?  ffڒ?ffvfb@! @Q"0L`/ fb@V  ",L .`8``/fb@J  L `tt L@`u= @.`8``r fb@6  9 f!@%if"@@`s* L@`s5 @.`8``ffb@  `@貔 ?@?|fc@   `L@`/@ @  `L@`/@ @  @.`8``/@ @`? [f,@'xL``/@ @ ``L@`/@ @  @.`8``/@ @`? 1 /,@'|L```-f@m  ??؂ Ю`??'?'ؐ @^ ٰ?@V ''tt  ??''''??Ȑ@< d? ;?``@. W?@]` '`K?` `@`  c`@` 倥ـ$  @  Ӏ?ʒ'? @  ''c @ !'@  @ ?@@?``'t`x@ܐx /+@|?~+@vfc@浐 2L@€ϐ"@fc@榐 .` €`".`8``sfc @斐 .` `.`"fc(@̔  Ϧ L@'t/ @f!@%f#0fa@$f#P@p@fa@%f#xt`"f@x f$@!f@Z#@x /+@|f!+@@x%fې#xf!+@@o%gҐ !@i%wgS 0f$@b!g@5 X@b㿐`@9 f%@P!g@# @1cgg`@F F& ̂?& & & & & & & 㿈 '@   @  @ @ #%@`? ?ax` ?`@"?` `2`?` 0#`#`@ @ @ 㿐   & ?& &   㿐   ‚b`@9`@7`)"`b@'$aq `  hbg@`$``? `?@ "r @d``h2``$` 2e`@gd  ga!g`!0g!X@^@h`" ` ``2``2` ``#```"1 ` @]`@[@0`@ @"@g@8!f!@]#c@`@ ` ` Q` `  `:Q ax@f$` `@"`@`2gg@!f!#@&c@`c`2`@p}`@!Ƞf!#m$`@ 0f@`b\`@"P $`  `@ @`06@@ߒ .@㿐ax%¦$   # b @ 2$@" 2 f@"Ѐ f0@䗐"@@@ $@"Ѐ  f@䆐!@@ $ 㿈 ̲  `Gy`I"p $@g2  $(`0`h `  ?b @  " $h `  ?b @gb(@  {  $`@ax B  <@.  @C 2 .$`m@l" b' ?@ cc`d $`Qg*b؀h"(`@; $`$@ b`2gg@"h#`@@@`@ $`$gb@ c@g@Ґ"0f!@#yc @ggb@   f!@#kg@㷐"@@qgb@lff"h@Ւ#`㿐N`-ac` c `ab\Ӑ gb70}@㋐@㈐ @㍐ +g^),L@  @M" ,`L@`  @@ 2, L?  /, @㋒b?.L@M"@ @+``2,@bbL``+`` @fb@9 - g#c @-"袒  L@`"  b\@?b b\f)@G!g@ @(cggb@=㿐@  f)@,!g@ @ cggc @" b#b" "Q  @ b&&  & @ & 2 ?~?_`@ X̂`&̒j&&@Д b`" p<@  @ /3&c &&@& ?&`@&&&&I@⤐ д  f)@!g@⎐ @cggc(8@ @2g@{#@f!@)c@ @⁐ f)@!g@` @ocgg&c(@X㿐ŐN -+c` /3f@9!? gF  @_" @Rf^"[@ZWfb@ @H"?ڲҒb@N   fb@F  Òc  /  `K@ @-  `@ g@ݐ#@ f &@ 㿈 +a 2_ )"@@H1'#|@j/-;9"#|@`&#|H'1@Y#|?@r c n `'(@ `I`  @ gb ֖ '%|. %a쀠`"f`"f!Y@!h@k @yc@`X0B ̂`" "@@$`I"`4$#|$`&#|#bh|`a0=@@#|?` @ a$!" @@%|#f"  @Gb$bgbז %a ̂`" aO)]%a!! $!  C $!@#|㿐? "@* 㻐h@ 0@ :@1@@@h``@@  4@@'3h ,∛,` @ @ݒ`p@Ր` 4@ ,, @ː@ ?є İ 㻐h@೐ x`@ #?N``g`i@h`@ॐ@h@ @@ 2N`㿐+?   @x&@&`&`&` b|`@ +@ &@ `U+ ;  @`0`=;    ? @??  L@:@ `?8`?  ? `?`?@"$@ $@<` @0`@"(@$ #@$ @&` &`&`&  ; L@ 2 $  @ &` &` &`Ȥ  $ & & $ &`$ 㿐b&@&`&`&`  &@` F ̀`@" `$@@  &@ /$ " @a?2`( @ &`/  &`& &` &&`!"|@` " @"|#@ @   $ނ@ b|` @``?@㿐 &@&`&`&`  &@     /@`F`"S O`   8&@ ' #& G (  O` 0&  (`8``  ('O` ' ?#&`&`O` "  ' &` '`?& @&` & #O` ` ' O` ' x`̀ "```@}?`Ā`2``2`  ``@M` :&`?`@&`&`'ܤc#)f+h-c@`̘ i&```$ `@%`@ `&`&`'@'`̀``` @`   - `@ @ Ҡ" "@@ @  `@ р_&`@͐ &``耠`&`&`&`''# `    @ * 8`@`?H&` P`@&`c@`̘ &`%t쀠`G@c`' b`䀣 Y& ` @  &`ΐ `̀`ʐ?Ȑ @ *dQ @s  @0@t`$ @c `?@ c&`̘`%&`t쀠`@耠`9h``"c@Vcc"` t@@t@@ $h& f,! @?a& c `?@ `c&`̘`e&`f Вa@'+&`[?!*@$@`@%!*%*(@!g@ @hgaX@`a@؂a@"  c``̘`&`.?쀠@ L$  ` H@K@@!@+h@ݸ!@@@f!@֒+h@ݩ!c㿈 ̒   ``@    h€?"dh``#"d"hN㿐@޸"' $  %ǀ`?@ @@W ?`?@ @`㿐!"d` #bl@ ` "W @"dbl@"d $`J `2 $bl@)' $$%#h |`  ?b %@`%$`|` `` %#ؚa c< ^0 8(`ׂa1#c SN#@b!@"$$"$b@@ ` `(`6b b @ܖ !b|$"` @Ԗ `(#b "b#@ׂc| #c#Tbh`h@!8f!@,[c@ 4bhb b㾠N`/I-l`#b`w@ې  @֐ !@  2G&`@Ő ?f@  f@ܻ ?-f@ "f@ܱ?f@ܬ ?f!@'h!p@i@wc@fb@ܟ  -ha?F h@ܯa &`@܃0<Z  &`ha@ܞ &`l`&`@o@m@k @h@s  @+!"@`   @, "@h`` @a@@ܐby^ $`~@`g`$`` 4`@"P` h@cHVbp`%x`2h9O"t`p"t 8У+`1h t <`!@@!   \@  @/Հ r@ +`8``z  a,<`O"t@2נ 0#@@ $#` bp@?4f@?"/fhhh!Вaؔ@ c` @{b @I0!h#g!ϖb!b @۵@۳l  %l!#@۪@ۨ @ۦ@ۤ$#\ !@a  z9@ܳ@ܴ@ܵ ֨В@ۆ@O  !h#@ܨh#@ܣ `@ܞ@ܝ?c h'  '/   /!/" >G   ''/#/$`@܁@^? h@N?f@I ?f@O f@? ?f@E f@5 Ӓ'Ef!@ h" 8h#bp!@582 $x p# !h`z  a,<``px<`" @ߐ@+` 8`(bt@(`$@  "hh08 Δ &`@d&@ @ f&` &`s@` @ h@a I&``&`@Ȑ@Ӓ `$} @y @ڼ9#c@ڶ$cn !@ 'h "@!'@ h"pf,{@ !g@f @tchhb@ !@ 'h"!'@ zh"@b!hg&@☒쏔!g!쉖((bt- f'@ _!g@2#h@ ]!@ U'9h# @? h!+'X!@ G'Ch#8!ǒ'@!@ >'>h#p!';㿀 g'䀠`  Ab((`cP@ h@ c hc@`<f` `G`I"`$@\ `$/`+``h+`0`h ` `?b @`fL@  @f"K@ !h@ٺ#@ `2t ,8``/f7x  _ `` `C"} @ٞ  2  @ٱ 2 }_@ " ` @2 @ @ @ i g  `2$ `2$`+` `%c(`c8@`$@@ vwhu@pi`h^! i`pZ i`pV i`xR  , 0r 1,i`@w ,i@/ f!@ T"Pc@p @ 0S@#f!@ ="Ec@3`$b@J  Y7L``tUfc(`@>  "LK7h`@ a $H`i`b`i`%c?2'@Ⰰ '@ 2'‚& @ " ` & x@  `#  `x `& &  "xhb8  "L@ `2$ `2$c造`'€`k`f* ggbb H䀠`& f"@ !f@،#0@ gb@Đ耢 f@ ,?"$f& @ز쀢?fh꼖 & @ؠ `f!@ "i @\c@j@ s@؂"h@ٮa & @wghb(ꊔ` &2&@` `8$N`ff!@ V#i!@(`/ ffb@_  f!@ A"i!(@ ( "f @  "qf@  (@x?&& & & & & `#`!x& & }#!x`"@ @ЀА@ג ? i@;&  `& $@  `x0`fc@  i 1f"?@ !i@׻!`@M @ f"h@ ޒ"Cff"h@ ؒ"@ק 0f!@ ̒"uc @ ! "@ !g@ה @עc iia@ "@ !g@ׁ @׏ciia@  (f!@ "i!!@ (Mi !А!(z@ h!p@`@oc!@ (vi!@׋ ?*f@ؑ쀢 f@ׁ耢?f@|쀢?2'hf!ؒ(o`, @ ( !@ Z#i" !@ T(mhǐ"@!@ N(jh"p!@ H"i"@hh!Вaؔ@c c` @b {{~}<||xw|wxz,z<zLz㿀' 'i-/i)+  27'+ {x'䀢 gK]"d "U `G"'`$@ @ @   $`2 $`!$" iLb줒  @N@ n@ Ĕ  $`2 $`$@ "`%&" a`$x`$$QÀbh``%"d%bh`2 ?"@b@ H ci-cc㿐@` &@ @@;(`@j& &3@@_ & &)@k"@q!k@D!@Rckka@f*k"@]!k@0!@>ckka@S +` `# 㿐k@!В!"`@Zk@"Hb"` @Pk@"`@nk@"@ik@"@dk@"@_k@"@Zk@"@Uk@#@Pk@#0@Kk@#P@Fk@ې#@Ak@֐#@<k@ѐ#@7k@̐#@2l@ǐ @-l@ @(l@ս P@#l@ո x@l@ճ @l@ծ @l@թ @l@դ!@ l@՟!@l@՚!@@l@Օ!X@l@Ր!@l@Ջ"P@@ې` ` ‚b@"l @f@y" @Շc@~ 㿐l@l"@Ք'm @f!@̒"m@a @ǒ"@ձ"" `   l@U" @cc@Z @6㿐 H |D m|G!)"%@$`0 -  ! = @3@  r@)@ :  $``,`2 $&,?" `" #m  =@ 2,۠#m @ ҐarU @a  @ Đabrʔ @@  &b   H{ m!{'@$' m? @ ! r⬰ a@&j @  0 r⬰m  @ Ӑ!@&' m? @ |! r⬰ a@@&' m? @ j! rq⬰ a@m@Ջ&' m? @ X! r_⬰ a@[@|&' m? @ F!Ȓ rM⬰ a@I@՝&' m? @ 4!В r;⬰ a@7@Վ&' m? @ "!ؒ r)⬰ a@%&!j @ " rq 1"j! @ T -â 4&@ )Ǥ+m`a@7,`"@ ?@*@  q⬰@ a4&"  0Ԓ @&%"⬁㿈`'b` @Ւ = ~,@ `I@ `J L` Ô`I+` ` @  8``_=`J` @ܐ@  $!`#`j2 $$` b#`Yj {A G `G4`$@ .@s쀠`1$` =,U`?*8``_`E b` =m@Ӛ!k!@$;c@ =,@K @D쀠`$@Ѐ``' m@x" !b`@Ӷ"В"R a@ @ Ɛ#mbX@ߐ $k$8@!m@X"`@㿐 ?`k$h@t!m@G"@C@k!@i$bm@<"@imk"Ȕ@c$mmm'D'Hb'D@$#    bm@# +j  bВa@Ӗ a@ӓ a@Ӑ a@Ӎ @x!m#"x"x #  #  #  #  #  #  #  #  $# $ (# ( ,m# ,bX@m a@j bPm `0c @ӡ#@P#!"@ "@ "@ Ho@;'b`H @DsH-mc8P@   DP`%PD`mmc@cH'H'P'L X%mH@ӡ cP  `m>13&#&b 'jDH`袘 ?/%``v &# ,``(@` bb`%@Y b`&m`S %&bDH`u ?բb쀣`2R!%`"#m` - `0 b%`b`2mb`7䀠` @Ӵ #À?!$`4  @F* ǀ . b@Ӥ`4?$$`4  @Da |2 $)9n I% $"h" @:jb``` `@ a`y y`@`` @` ``2` `mm!|b<ٶ' 㐀&/ě.  `b  `Gl` $@g@@L@`t"lL`@ߐ@ %&@ 㐀@!"\`"\`!@"@   bcc%b` D HHx mx#'$"h@{ c owⰲ@ѡ@  $`2 $&@@ ' ?@b c o^Ⱑ,`@ч@  $``2 $&@@ ' ?@G a xm Gmxp#w bmbX@ ~d c` @B@U#`b`b@є"Հ`S@   b%(`H@ "d@  `I @ ` * @ `*`2"d(``$ #c  `S@EP/Ēc$bd `S’b bdK`2m@#@`Sbd   bn @],t`Sb`n!"dJ`r @ `f@ 2nJ`rJ `[`S%`V$bd  N bK`K`SH cn@н hH@bd@";`Sbd  3#bn`@Х n`'#c/Ēc$bd- `S@Е @`w w`@``{ @@` y` @H @7@L@`tL``b`2n`` ,@ `X  #c  ݀`S( n@\`   "7n@F @Pb`7@:# b `$n@4!k!@Y!c@@' H@1J"d@! k!@F!_c@2!@G"╒ ?"k@?"⍒ ?Ck!@."#n!P@2"‒ ?3"\k!@ "n!x@@c@!zcm `I@ %@Q a blD@  @H+`@ # ` `$@Ͽ` G`S C#b%$L @ϵ k!@ڒ#0c@@@cb`L b`%#`bb`c`bn@ύ!k!@"Jc@b`@[b̀`a !'` $"b`c`cc s!$"ꥐDD` !` # ` $# 䀠`gb`^b܀`e# @*k (`H@Ь@`#bl$#b@/#@9n@(!@2’b k!$@En&!n  "@Z"@d"@k!$k$@0!k@!@c`4nnb 0@%*!@"!n"@ @IJ$"$"vcb@e>cww# x(0Z @I2$"b'@O Zx88888888888888888888888888888888888888888888888888888888888888888888888888888888@88d888888888888,8L888888888L8< 㿐@Ψ"!nb`bp@Β"#c,`%c(8nn@@"@΂"nbc,@}"%h`b@"Ђ `$"$"` ((@`"``nb@c"nbh@^"А@~"В@ω"А @ω"@a"Вbx@O"n@] (․`㿐n'H'L'P'T'X"H㿐n'H'L'P'T'X@"H㿐n'H'L'P'T'X@ސ"ВH c0#c4㿐n'H'L'P'T'X@ʐ"ؒqH@Ͱ 㿐` .bx`2 H@N`03  N `"NN`0( N `x`?`X`? ò`I.8`e`?E`?   @`  N`  㿐 nn`I"b#@͜ $@+@ nn`#b# @́  $@͉@{  $+@6 $& & 㿐@d/! $#8 @r/#8/x@  (&@&?n!k"n@>#@LcnncHXa/&?#8$#8㿈c8`?@#c8 I" :2 $㿐 $ ``( `2" c8 ;#c8> >  >  >  >  ${` 6 $& `I)& `S" $`S c@F`$ `"  & @  Q&  @   +@vȰ $`"k  & @А  %&  @   (@  $#"X (`& @̽  ;&   @̿*  $@ +`  @ 6 $ 4 $@n!"Đ"n@̗#@̥c nnchpn!0"n@̂#@̐c nnchn!("n@n#@|c *nnch㿐nn #b !? $` $ 66 $@m $6 $ 㿐 . $`*+ 0``d `S`" `6 $& 6 $c8&& #c8 6 $ `6 $@1 @- 0㿐`bH@ $@?`  x . a@ c>S ` +@@`@"ꀦ xn@#〦 xn3 @#xv ?К @J /f 7c`*` $@`0dc?@$@^?b`Sc<`< c`O x@Â`I K@ @ J$@ K@ ` @ ``*` J$@ K@ ` @ -$@+ ) ' % # ! ` ؒ֒o3c<@y n""Wc@$@o@h @r x LxxxxxxxxxDxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx4xxx,xxxxxxxLxxx$xDx<x`pc8 m#c8 I & 6 $& W& & (@  ??? @'Ԁ@#`0`&@K  \/'.Ԁ    @&`@ʼ L& * $`l6 $@؀   @`'.K  \'~Ԁ 6.b`2oɐ \`@ʍ 0& @ʐ `@ʁÀ @n hn"!c@ \n!"n@\#@jcon`pn!mv"n@I#@Wcnpm ?& & & 㿐J  $`2 $㿈c`$h2'9'8 C?$8$@$`$ )$` J6$o   ?& & *6$0 + b@u @(@ a`.` ` c .`8`& &  6$@  &84 $$$ 4`$$@$`$$8` &6$Ecbbp $``@ `. * @ɷ  q& `  @ɮ*  v&@ *@ɼ    ???  $ ؐԒ@ " ?: $$?? `? $(`@#@? `  $@ "$6 $ dP&   ",`,`@m` F& non b@w" $@[  "t"n@G# @Uc *oo`Ȕhn"_"n@2# @@c n"Q"n@$#@2c oo`ȔF*㿐`?`?@('  @#.@ ,`@`@ @  2 㿐`?`?@886  1.@@`',@4@12@:@)@&2 @:@-`@`ڨ @ 㿈%o >($)c`    `I@ _*Ø`I @ `   @ `2 c`2 $  `I@ 2b`* $` 6 $ @$@b`'c`"}$$ @,@@>`I' @ ` ,@`2 $耠@*$ $` 6 $8``+ `?`-`? L `i `?`I`? i *8``n `?`N`? L `a `?`A`? ~L `n `?`N`? t $`"``6 $``6 $@Ȥ쀤Q !>(p)8``02 $L `x `?`X`? "v $`  "$U $` >6 $'  `I@ "ف(* 8` $'  ` 6 $>L `n `?`N`? *L `f `?`F`? 2 $*Sc`oL `i `?`I`?  a@L`-2 !aH`@3c8aH@8a@㿐`,`&`( 3!|@Ǎ#@#* @@(`#@+ " +`@*# +` @ @ $ .#$`$ @ # c 0``("`$" ϰa$ *"`$`("`$" cݰ㿐/(#`,`D 2)  4@1 c-+| 4@) 4,`c `$@.@Ǵc* @(`#@+ " +`@*# +` @ @ <$$ 4@ݥ,` 4`0+`( +   `$#`   @ d`@_`@㿐!`( ,?#?]? `0$ ,"44`(`@ #c"`( ,$N&@` #@ ;`+`@ @ #?!  `0  $ ,"44`(`@ #ci"`( ,"/&@ `(#@ ;`+`@ @ $&@    #`0"4$ ,  `0  $ ,"4 `0  ?$ ,"4o"@ƥa( 㿐 @s@Ԓ %+,`(*?#?o,`'`А!X 1 +oao@ a@  `0$4$,- ,@`$%`(`0#` @C4*  `$` #@ ;`+`@ @ #?o,`'`А!X Ӕ +@W'ڠ4(`@#cp%0'Ԣ`    ???S`8`o`@  oԀ10`| `?@a$@0``?`?@"JJ`\nJ ^`? $`?   .@ 'Բ`0`Y @ @ Ӱ&.@@Ð "o @Ҕ & @ź! & X!0``!T!!T@ $!T& @ *`!T@q @ 5!T&@@# @ +@& PaP`F6 @ž؂ `?8`?  ?`?`?@"԰    'H`?Ѐ`I8  \(``t@ \.@`.@ `'!T+@3`8@E!@ U0aP(@ `X$!T&  ,Z  y6 c`܂ \.@` b.@Ԩ dc`".@c`2.@Â`I  x 3` ``?@" .@o!@  \.@`.@`EԒ .!o@!@cooa$ o !o@!@cooa! D !o@ܐ!@cooao! o"oo"  m6 @֐ʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʬʄ㿈7 `  @ & V @ @  `0``?`?@ %? "V   @8u ` 耠`  '  , š, +@& 㿐@&  $  (  T ` ,@2j@.@,T @( (㿐o!3!&o4"H㿐 #Ú `(@R   V ` `6 (`8`` 46  `( `@ "0   "o `G}`I" $@F  $(`0`h `  ?b  $`\`4 $ $`P& `(V  `( @& & 29   "o `G_`I"i $@Fb  $(`0`h `  ?b  7 $`H`4 $ $`&7~ K~V `Poo"Pa@Ï!2G %L $`$@ h"(`} $@:,  $`"' # `$@ $ $h"(`r $ $o" X!Go" S!5㿐c1` bc1``&!Tb ` !Tb&!T@ !T!Tށ1`M `` S``  @ @ : J@` ` 㿐 : $#N@û`@  *N$@@@`? 㿐" !oN@à"h  2N  p-c` `? `?@㿐@ @ @.[&@&<.X`\&``X0``.Y`X7  &D&.Z&P&H @ 4@ $  , (@ @  P @  (@  &" 0" ,㿐 ``$ [  @3  +  `&  [`" & 4  "@q  & & 4 @h.`瀢 @  @_.`   [`&  0 @ 4@$ ,x   $     P'''''' $@1  (@ @@Š?68`?`?@<,    # ?,   #& C& 0 (@ @@   P@  +@ *?` `@     @ 6 @2Ȓ& & & & & & $ (@ @ P'` & & & & & & $@'& 0& ,㿐 @ 4@$ ,@ `I (@`@6& 0 (@  P @ @` @E ,`@&& 0 & 0& ,0 @ 4@ , Z`@ P`" \@ 0 %      $ P'''''耢 K' (@ @@ϖ `_@ " @@ؔ؀ @a \`v ,``@ # @ @?,``@ #@6& 0      $ P%'''''耢 '  `  (@ @@ * @    6 @2@r `8`?`?@ (@  P`@ (@ \`,`  @ ?``& & & & & & $@ \`,` @,` @@ "`@  ,``D@6O& 0  ( @` %@: W% (@      $  ''''''@@ `@: "2@2@؀ @,``@ @ # ?,``@ #@& (& 0& , & & & & & & $& 0@  (@ؐ (@ @@ , @,` `@ @ & 0?"p @ 4 = \`2  ` +`"`@  . \ @D,`   #"@?@ (`@ @`"@ #  @%@ D@& @ H@& H 4@  Ъ @(` & 7 8`?`?@? (@ @ +@,`  @ t`& & & & & g& $ @   @ & & & & & & $X& 0㿐`8 @@6 ``.`  @6` T(``3@ `5 ` " ]0    .`" ^`  ]`  `   L @?` `@R  _怦  H (@,Z ` "T ` 0@p \`Ԕ? `2& L [ 2>  , 0 @#@& ,& 0 ` @ H " @& ""@& (& H& @ X` & 8  [`2 X& ,& 8 , ",  @f* [`/ P`"& 8& 8 @ H& & & & & & $@? `` < D [& @& H& L`& ,& (& 0. \& `h , `& , Y?`' ($ @ 8 ?@ * (  @``2 @@ : @ ( 0@@#'  @ @      $''''''@@, `@ `?@ @@& @$@'& , ^`A "  ] & L , $ [F& 0`   ,  6  0`@ 8`,` @4@` @&`& L  @`? " <,`@"|  < D @#@@@& @& H` . \,`@,@1  ,``,`M,`#@`& ,`   ?*@ #  @Y , @ H ,& 0 ` [@@Հπ ,"@Y [ (@@  P`& 0@ 2`(` T `3@ ` ` " ] & L @ H [`  & ,>& 8/N& L%, *@%  ,"@  , 0#@ @& 0`& ,   @ @*$  ,@   ` @ H@  P`B @???@/؂%`??  @ " "& & & & & & $& ,'?2 ^ (`?"'& & & & & & $  < D @#@@@& @& H. \@'    @ @+   ?+`` # [ "& 0  @ , , [& 0@7   _ & L㿐@u @s  [` @l㿐.`` $ $ $ $@P$ ` $  㿐 & &@C &   " && 㿐`& ``+`@/& &   ``@0* & && && 㿐```@    @;  `i@,  { ` $$@ ?`** @ 06$*`@ @:? #@ $@+C.`, @ޕ*L @  ?`*,* @ +@  +@ 4+ " ," ,*@R  "+ (` +`" .`,㿐 C :  @0`@ @ 4 `0 &@p* $ Y     2 ``,  `# $&``@,`. , # f`  `"$``$$"`4`$ ,".@ @0*` @$$$ ,,`@ @!*  @㿐```@ ~  @@ @   d@@  m $$` a?@ 88 `, 8 "+.` @ "<&?8 +` $.`, @@``@@@4 @ $+.`  (` +`" .`  (` +` "+8Ȗ8@(` ,  @* $``㿐`  `@   @ `& 9 /` 2`@  @*``@"`*`*`"  `$ *`@@4" "    &@P*`  ?$  @  㿐  @  ` + #@ $   (`` &@ݒ   ?$  @$  `? `?@2  `@ ,   `*@@ *  `  ` * 0`+  @ &   *@  ` @ @  "  *` `" ` @ *`㿐   C@ @*#@ `@ #` (`@`?+#`` (``' `"   +` w@ #   +`?"   @  (`#@@# #  @ @  (`#@@# #  `^&  \`$ݘ ښ @U? ";@{*` L? `B&@q,   "6@j,   "+@@a*`  "@@X*``?`?@$`?`?@2?& & & & &  @ Ȁ @ 瀠@ ڢ@ ͤ@ ? 㿐`&@` > ` , ` *`@ ` `,  D@@@+`    @ $@  (``$"  `瀢   `@.    $ $ @  㿐@ @ $ ( @@`@ (@ @ 0@ ,@؁㿐  +    `D@@@+`` @ @  ` @ 8, @  40`@ ( @0 8@J   p `X <`4(@ .@ $`4$`(U >cP,+`@@`3 c 3 `?`?@2`43 0`@ `@+`@ =9 ;$`4 "#`(@9  "$  2$  @" $ @" 2$X4 `) &%@$`4@& @ $`(ے`4@@ $`4 ) @ %   %㿐}  +    `D@@@+`` @ @  ` @ 8,   @ @0^ 8@~  D   N$ (. >c%)#@*  @(`@`3`"-3` 40`3` @ `@+`   $ 4`0`c ܛ* d   %@$ 4c"  4&   @~ %@bX bX p\` ` 0a ~ `? `?  `` /` ,`@` 瀤 @`. @"`\```4` 0\@,@* @ ``2$@ `d" $@ , `@ ,`$''''''Ԓ@a@ `  @-   `4 ` `.@w` *  `@ `  ` `"d \`$    4 @>8`?    @" `.@C  * `y ؤ  9 @" \`4 @$i`, @???@ ؠ ? ؐ`.@*@@@?ؚ .@9* @2 `` $`" 0 @w!   @ & @Ԓ@͔?S  P. 㿐  !@[ $۔ ( $@ $ ,@ $ 0@  @ &  㿐 . pahp@ !@ @@   @0@@ (㿐 8@  & @& 8& 4@ & 㿐@  `2      @ `㿐 `"  `2 ` @ `"   @ ` ``" `+````(`@"`  P+@ @ " P` ```"``` @` (`*#   P(@ +@" P 㿈`耠```''&` &`?   ``` &`&`  `` `"```2 ```` #`#`` `` # `" 㿐```  (``@``p`` ,  n" p#Hcp@A%```cpp#cp@6%o0\``` , #``T`* Ȑ@0M`X @ $`X``2` ````"`` 4`*p@(`` @#@@ &     & " " "``* @`" " & "p#cp@%Ԃpp#cp@ܔ%ɀ   \\ 㿈.`@@'`'ސ?* c* ?!.@ `@@#```     @ #   #@ 0`@ c@+`@ "㿐,` `{@(` ````(`@ ` * : @ 0`3 @4  : @ 0`3 @*?3 *@ c@2 ??X * @ O 0i??*  :(` @` a?. * @~ I ,` `@(`  ,`@@ `@?  @. #@[ $ (``@"  ` 2Đ@`?@    ,`. "  7  p@(``@``S  `?@.#  `` "h``9@`+ ``2   (``-  (`` :Д `6' ' 'آВd(``@` `,` @Ԃڒ`?@`(`@#`& && 4 @Z   ђ0'(``## #  `@``"`@+` `0` ` @㿈`H`8@ 4` .    @ y& .``4!`8 `\2 . ```6`I `"   +` }@ & `s8 (`cx@`,@߃+``@?ۢ  .  d& |  _2 ޚ `8 `@@ $. n `8`(`@@ ˚ _2 ǚ "] "Y  . 2S  "O  . "I "E  .  `P `8`L6 `@ H`   @ 2. ?  . 2&  !  . 2    . "  . "  .  `8``@@ &`8<`8 ``t&`8  &.  `[`€`` .. ``` Ö `I  ` @ _`?  + }@ & ـ`V8ư (`b@2  2  .  " 2  . " 2  . 2  . 2 !& .  2  @& 2  !. 2} "& 2v  q 2m  &ؚ 2e  &К 2] Ϛ &. 2U  P 2L  . 2E  & 2=  . `8``(`@@Q   `_"  +` }@ & ^  $`\+`` : `,@  `"3``\ *` @ `(@@ @ `2#`#`@@@@@@@@x@X8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@pHt$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$x$$$$$$$$$$$$$$$$$$$$$$$$$$$l$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$㿐t`8@&`8`H`8@ 4` * k @ *```4`8 `\`[,`]"( >`^`-D  * S `,@+``@? `\造`[ `8``@  "`8`@  * *6 * `8 `@@ ``:  `:`=`.!  **   Ȃ  * `@ `*   * *    * ** *㿐 @#䀣` 8+```$ @ `& & & + +@?& & & `& &@2 &0 @   8"$ 8$ @㿈/͖㿐`0``@   `(`P@0@ `<   ߐ  ٖ  Ж ʖ `?`?@`?`?@?$`$`#  @ @ $`@ @ $ $ 㿈``'````"``  &` " &`"㿐c?͔`1@ ``?,`? (`?/  @ ?:@ ? @ @  ??Ѓ. @@@ Ѐ@4?`@?㿈%     $@"@`@#` `@     $@  `    @ `Ӣ  㿐@@ @ ?@ @ @ 0cc㿐`   P,@   .    @``  @`   @` @` @`` @` @` @` * @ @ @ @ ! @ p <c$@@ @,@ *0@  D @(`` ,` @ `@㿐 "  &@_& & @\ & 㿈```$`8`,@  `(`   @(`  `` `$^`8+``@ $ `8@ "`8 `8@"`8`?`? 2 `Hp\$, `H@  ``"`8` @`H@- @"` (@t `2`8 `[`2& `\`8` @`"`8@`]2 "`8 +@`"0  ``2U  $P `@ 2K  $`"`8`8`,.`" `.` `(@ @ @ "```"`8$@@ `( @ `"`8`2$쀠` 0` @  `(`   @(` "`8 㿐@pc@h Oppc@a Hp$@@ @#$(` #@ `p&$c@M p Ô`I  7`(``@ * ``@ @ &@ `7`? c@1 p Ô`I  7`(``@ * ` `@ @ &@ `7`# cc@  pc@  -p Ô`I  7`(``@ * ``@ @ &@ `7` Ô`I  7`(``@ * ``@ @ &@ `7` c@ې p uÔ`I  7`(``@ * ``@ @ &@ `7`Ͱ c@ p Ô`I  7`(``@ * ``@ @ &@ `7` c@ p UÖ`I  7`(``@ * `W`@ @ &@ `7` c@ Sp ;Ö`I  7`(``@ * ``@ @ &@ `7`y  `@z/` p & & `I  @ `" ` 0`+ `@ *@&@ ``$@ X @  〢 `I  @ `" ` 0`+ `@ *@&@ ``$@ > c@0 (q   u7``(`` / @ @ &@ ` 0#e " ` 0`+ `@ /@&@ `` 0`@ -q Ô`I  7`(``@ * ``@ @ &@ `7` `I  @ `" ` 0`+ `@ *@&@ ``$@  `@Ӑ -q Ö`I  7`(``@ * ``@ @ &@ `7`Ű `I  @ `" ` 0`+ `@ *@&@ ``$@  @`   Ö`I  ` 7`(``O@ * ``@ @ &@ `I  O@ `6 ` 0`+ `@ *@&@ ``$O@  `I  @ ` " ` 0`+ `@ *@&@ ``$@ j `I  @ `" ` 0`+ `@ *@&@ ``$@ U `I  @ `W" ` 0`+ `@ *@&@ ``$@ @ `I  @ `" ` 0`+ `@ *@&@ ``$@ + `I  @ `" ` 0`+ `@ *@&@ ``$@  `I  @ `" ` 0`+ `@ *@&@ ``$@  㿀 '@  (@ `?`?@g 2X`k `*`  8`0`+ `* @*`$ " \ +  8  $ \`  < * @ $ /'    \`X @ /$X '  0 @ $`@ '@ @'@ `$9@(`c@  ] "*  \`E H 8@ @ ,@<+` @?8ǔ  @h `?`?@ߦ '@V @ `    .      `?`? f '' b 8 `? ` `s@`  `8 b   `@`’ `?`?@2}   "u `@` @@ `?@| @  ` `?``? _  `?`? 2" +@ T   P@ % P ~ J L X `% Lb% X  o <  \`W X@ R% X`  &` ݐ`  ֒ @@ "q  't'p@   (@ `?`?@  'lN'h `ܦ`"  `# h#\' 2'@` @ `@  'h`π`" 8`8q(`c@2K X`?`? 뀢v  &  &  ې `?`?@J`!pq`?Ж  P@@ `?@ؐ /  `?`? 20F?L ? ``"%?`?`? -8@ @  @ " '@Ò `#pq`?( 8'@`,2ݤ?פa 8 b 2u` '@ `Ґ `, '@ PpΚ '@``h 8@& 8l`"  \ +  8  $  \`$   < * @ $ `2 X `2 X `2 X `2 X` $`2 X ` X@ % X /'    + `z   + @@@ " @ݐ   0``+ +@ @$  @̐ @"@`(`" ' 3 *   +@ @ w$ 3``@% X`I    `@ _`? "``+ @ "``  ``     T+@@ % T   " "`0 @ '  'l`$ 8@& 8+ '@@mpq  '@b  '@ @$_ `?`?@ޠ`@@q6p cp@D,@& 8`׀`  8 @& 8 ..  /#\'ܔ 2'@u \` `?`? ؀ ․    ??x ?@ `@   @ @  䀠 @  @ @  `8`?8`? q 'x'x@ i ` t` @ @ ``+`"`#%`     S 'x@b 4 @\ 4 4 +   -@ @ $  &o  & /' b   2 '@7 & 8&&.  }@ `}@@F䀢 i   '@ `@D- "֐ 'o J /'  Ā `  @ڒ 怢 ` `@!,`` "@,``?`?@Ő 't%`%`a`  @ @ '@ '@   '@@܀   `4 5 ސ1 @x ` @R  $<    + . @ ?-<@@ @ ?`?@ `X@$X`   ( % %`0%`,@y`p&`k%%\`2XX@  `'\X0``*2(4`2$4   *` `` (``(@L;` @ X+ 0`@+ (`@ $\$X4` ` @ *``@ $H *'XL`Xd  ,h*```" ,X2 $$ 4`ؒ$($0$,@h '\\  0~ *+` `` "  @2 ΂@ @ (`@`ɒ 2ä@@*`@ 筐 dJ `& `@ s*`"{L @v  `"+``@:nL*` ```J `6 ``{#`@Eڞ  ` "ג``@`Ғ`^4  + `V  + Ē` 0``2 `L`"`L`X`&``L`" `@@[* &`   `    `"  ` ` ` `  $ `  ``` , @@  `* @?נ ``@, `   ʂ QX$( KX$,XE (`$0,` X^ J `825XJ D`C`4%  & @    %% @  QTPPQPQ\NQTPPPPQd㿐쀎b@@b$$ $ @! $ 2 #"$ ? @@!6`+ (`@$ $ @  P @+@ @ $ 㿐bX2 `+`+@ @@ &\  * pah1p@ !@d@ `` `@`@"` 㿐w` 㿐  ;(@9@& &`&@ &` /@& &`&@&`㿐 `)  ,@ `  ,`@@? @=`@,@6``` @0 @4 & |@'`@%`0& |& "" " " " " " x @(&@`@$ ,`@````o܀ '&@@܀ `@,` 㿐 4@ N . t 2 4 X`  ``*  ` P`"  *`@`   & t Z 㿐 hΐ`2  d  ` @   ( + @(``3`3``c````" `` `2 ` ` " `"ܘ @ 㿐` 2`.@` ``6`2`J H @`@C2c"@ x h`` "8 `` 22 ` $ `,  ") 0'`3 @(` 3@ ` ۳2 `` `ӳ2 d``2 ̀c  ݀` d``@" 2㿐qq&` 0`@%Z@@ , @@ &@.@@  @@`  ' '  '  㿐 `   @` @@``@ @  㿐 4@  x ,@ &@ @@,  &@, *   t@@ & x㿀@@(`   ?' ` ,`@9, @ ` "4`(`@`` @?`  `y `q 2`k "`*@ D '`4  ,`@ K `D?c,`@E @A㿐 | "`7`@?`/ @(``@&  . @`(`@`?㿐@ d(` @. / @ (`+@)?#6`,@ ,` ``"``` 2`" @2H " @2@?6`=`ق@@ @(`H@`, @  0@`  @`@?׀ `ʀ܂  (@4  H@`ؠ `? 㿐.`@(` @`@?@` @@  `? `?@ @ o㿐 d>:``% ,`@*`@  (`+`@ Ő`@ `@, 㿐` d `,`@, ``" `4`9 `8` P0@ `"`  @"  *` @˒ $ (` `` ` (` #`& `ڀ  @ @*` & &   @  㿐` `?.@. `@ @ .?㿐(``@ɐ .. `@ @ .?(` ```2ق``  2  ?   㿀0` 6``! `, @@(` ? `@4`@o`&`&@&`  I @ah d? -@(` @ H@`l <   @  @ @3(` t@+`` @   T# ݐ'̒␐̀2 @ @G t @@ t@`Ă ̀ "H@0<@@+``@ `  ৐'̔ZԐ@̂@@ `"'  '0 @̀ 2'̐ '́x.`@```` ,@   (`2   @ &(` `2   @"' @`2 @@   `8 2 `8@  @ Ӱ ``ϰ  @@` ဎ 2Ű  Q  ``\.@  .` @N`.` $` .` @@  ?` $@.`   ??'? آ.` @ ' @ '@ ` @.` `xu rp  $`  `@ 4 @ `X @@S````@@ J@ ` ```? `` @  =  @9  @ 65  ``?F`@ &) ```? `` @    ```? `` @   ӂ   ``? `` @ ǚ X 'H@ d@.H'X'Ā 'T'4 H "H t 8''& t& 8?ܲ h-  ` `40``2 ?'耥 `X`40`` 䀠`޸♒  t- $ X n  `j-  t@``'䀤`0  `?' ` d! ,`  .@`h2m'@ʔ " `. @ ࣐ ` @,`@,؂ `'䀠` \ '̐\ z' h?0̒5  t- $ `` X @@@X* t@   H#@& 8 & tT   ޛ` Z'0  (` . t@`%'ԬВ`ߦ I'Ȓ) ⱒ t 8 @"o. @  6w`@z В`߂ D'@J̐5\ '06 8'̒\ '0Ȁ`ɀ@vKȀ`"m t0ւ ` "@_(` H`", @ `*@f H`" t0@ 횒 H#` 㿈 #\ q | @? $  + @ (` @ @W + @ (`" |+`@ (` ` |+`@ (` ` |+`@ (` `  |+ @ (` (`@?&@  0` & |&  4@@&@) `* @    | (`+` * & *@  @ | &  @@ғ*`昒 * | @ ͐ `` d'H`' 8#'ԗ/`'Ԙ @ 'H *@ا/ @```0`# h  Ԁ  Ԁ  Ԁ " | |' d N?* @(` @ @m K@`2  b _ .  (`@2( - @ `#   ,4  @@U 2@   0 4=  @0`@@4 $@`$ t ,@$ @K@K?  t,`@`2|``@$ 4  ' |ЀЂ*@@ (`+`К`'Ѐ R` @@@`@2``  @`@ @ ؠ(`$@? h t@ , `@ ```(< 'ܖؔ t @@ t@`܀`2  |@ `@4R |К`'Ѐ `H`Ԙ @ ''  ?`  $@ `@: f$ #\Ԛ i s @U@  @!  M"" + ` @ $ AJ` M'ܒ F' |= 9 Hr 5  / U d t#@y @$ J     `@,  $$ @’  `\`0@܁㿀`8`x@`d `t,  @&`xL`3I`t, @`2`(#@ (\& 5 `8`h `t @ٴ@L'''Ϥ % 40``"  %`t@㿀` [`  @ `$^ ,@`  @~ t,@`B'``` d8 -` , @`h2H d@ ""@` " , @c  " ``& , @`ߚ `@͛-  @; 4@ @C/ܬ?2 ` i @`+`@@ "  ` , @  ` `2`@  @ P t.@`' d` ``@ @`  t@ 43``2v d 7'̒̀  ```ڻ '``"` ' - + @ (`Ě `@&`4  a'Ȓ޵@  @0V@& (`` @ $, @*` ``  @ Ͱ4D? `'Ѐ . @'(``' '`s `-@`, @ ` @`2@ (`@ '+ N`d@2N  @ `T , @` @&N@,`@ "N # "N 2NЀ`''ܐۄ @^Т ``" @   @? @ Ѐ`@ '0@ `@y`y ' ` , @ @ *`@ ڲ @??? "  , @+  ```  @"  @"     2 & , @@@+`ۅ    耤 ? ߀``@``` `'''''''$ "J'mj h  '''  H.  '?'@? ^@C '̃(``t@+ @ ?`,?̀ / @`3 `d` "n@ =`d ``2`h u0``"@ ֒? / @``%`lȒ?* `t@ `ø`` 2 '`?@`%'``p@2`d` *    *X̔* @`@ (` ?#`& `@ (` @ }3 `   x `̦2   \?`? `R, @u  ?RC@s@q0`(```#@wu"`̒@@@_ $?2N ٽ ?@(`@`+ `t@ 5   @, 0 'ت 0c `@)  `@``@9%@`@@(`"$ @`$ @` 2Ւ?`0̔͸@` ׳ "?@@ @@ @ @ *`@` ?`@%`%`@@ѐ 㽨 'H'D'L'T\  @ 3 @   D`X'p @ D&@@' 't'tDt`&@ $`| ( x,t0`p``` ```>D"'TT`\ 'T `'|L` `D \ @@  L` 4 HLў˒ `'X3` `/`H\ `[`$`\`L $`0$`, D `'/'L?'ĺd`', @'* '@$܀`M'쀢   $`$`$` `8X0``" '* @   't d  @?T`:`T''' 2'T  @\``? 'l'x`2  pD  `?0`@  T80`@p@ @ @ 'x@      @1x?`*(`c0@    H'|"@ @ L@  \@ N `<@ '@  @  @"@  @L`"q@H @ 'H @ H@`"`@L@ H@ p @H@`d l` T``@v'''Ѐ'h`dh $@ `8 4?`''d'`'\ ?i`h e (d`t "`4L- `#`43``w3``H`8@ ?h``4@'X`,@$`@`40``2``8`$`8` @``, "!`0 (``t`Һ `X`43``"`83``2`8| '` 'd 'h`H@ 4Ǧ`h`\@@#@`pD`3```?'Ā`  2*L` 3`*@ 'D3```?`  @ "LX`L`Ļ, `@   L`"@ ` @~@ `@`?, `t, @`"?`40``"?ʔԬ@H @ p @@'H p@ K@ "`߀@@ L@  H @ p  @H@`'퀢@ ``2̀``8 2E`8`8K`H -`.`2 `t`>|d ;h`8`x  *`t@ ` $`8  `?`?@2`8 h @   @`t$`t$`p$`l  @@  S@ '@@0I  20` ( 's'h7d ) "@ ꀠ`~, `\| Д '`'d` f' ¬ `43``q3`Ր h'  vߐ@ @ 0耣@6b`4 \' qq P`@@$mװ @"l'\j `d u-``  ,@ `h0``#`8z`h   "`  2`  "` " "`q`8 2`8``ʀ`@@$`X .', @ `t - @@ +` 6@ HԈ ( '`h?3H8`t  @@P`t@`2` "` 'ܚ `t `8`h ڂ (`@d@ 'H'L'P ` gqq P`@@$77 `4  ?+ `  ` $ `""D0```?`  @  X`DL`4 DN`  `d B@@@""   t  ?.`` `#@ t`݀`ۘ  +  @ `(`+  @ `#  (``@` #  `@ + 0’ "*`H| (`" *"`d'T@; '< 'P  ???? ,'`,'`0'@'0'4u4+` ' @ T+` ',`0`0`'(` #(`" (`( 4 '4 0`+  `(?*@#? P  d'''''' ''  (` T\` <.T `` ?2 @ #?@`"  " (  T \`  <.T  ``? @ (@ #?@ `"  0 +< @ (`@ '''(`.@* @   ?@ #>@ `2*  ` 0' '0 2r @*#@ @ # # # # #  # #     @<*  u0h'0@@    @(@ +@"" ` "4 0(`@" Ԙ # # # # # # # ؗ."  """" """ 10 '0'  @ ӈ $ 20, 3  +`@  0@ `ua@d' " '''''' ''  0  <`@0  ?'8@<8`   @!'`,`"i 4@L@@ 8 <@8  @< ' 0 '888Q  '@*  'L8+ L@@'D   8'H?0?? N?(<'`'< `,  T(` @ @@*`@ h8 ' 耠@T8Ԣ .L # 4`H @LD".@@  *@ $` 8'P`2  @! t'`,   ( T. @'$3@2@  d 8 {, @dm8 @ǒ" E'`0 '   (. w 2@ @   @` @@  $``@ h, H#@ @   ` @@  , L *"H@  dT8 H #@L@T\` 'PT8 D \#@`Y.0`L0, D@ P #(@ #(@L@@ 8  <@8  @<`, `~' eLT\`)< *@@ %@T`@`{'`q m' *@ #` ?@k T?@f T``@ `{'`,b"Q'`T.T@ @  `@ #@f`.T `?+@#?@v`,`b2,'ZT44l㿀\6  @ Ӱ?@ŀ`&  3 3  ``  `r3 3 `3 ``  @, ?#d#\#` R?@  0```Q`qq h`@@"@ `q  6*@*" @`"  ?*"" *  `++`@ 0`%  ?``"8@@@qq `@@!` @@0P`3 7 @  ">@y/` "3@r/` * Ț $$$q `@@y" @i0% @m `j g /`@N$@K$ 2$ ?&@ Ѐ @ Š㿈d7 4 h@& ,?@)@$ h`#`#\\ 0`#`#\\ @0?㿀'h㿀\`#`#d #h#\㿈#\#`Ś㿈 #\#` 㿀?0  @ `0`#`#d#\#`@ `0`#`#\#`#d#㿐@  &@ &` &` &`  &` &` &` &` &` 㿐>   a۪@`>   aڦa@ @2  @z@ %@+ @ 2 +`@ $$@$%< :  @ $+`@@ `@&@ @ @ @ `& (`@ (`#@`& +`@ +` @ @'(`@0  @Ӑ@E 7`" @gl''      @ d 2 @! " @@(`@+`@@q@ `@ `?`;4 ; F'''''u@@'@c 2? 耣`@ ```!+` @ (`@ (`"?'@@ j@@'?"Ȁ@&`% `<" @ @'@  Jܕ 'q` JqaL' J 'Lqa LJ L' Jqaqa)/?& && & & & & & & ^ qa ?????'',aH,bȔX㿐!`1c`- #! @ &s@aЀ !s@ a؀ `I`X    `" `@@,㿐s!# d. s`8@@a@a㿐-``$.   |@ @ @@`@"`, `@@$,@ ``2@ 0 s!ْ!as@"s-cb;`s`c28`@" ` H42 H H H H#㿈?葠J' J?耠` `? ҁ@sc sc㿐%ds @ (`a|@   @$d ,`@ ` @* 0s#a@j&d@Z $ $ $㿐`$``6`$$H  $`` `$`" $` p $`@`$`@"+`@Hy  t 0s2`$_`$+`0`h `  ?b "`$+`$h ` `?b "  `?` `?" @C   `(`" `0` !` `X J@J@ "    "0@` "0 $  ?????????KT逢 ?㿐1!X`s+`@ (`!l@`` `` 0s#0a@&g!X㿐+aX`Ds+`@ )(`!l@``  bp` '`H$8$$ $84 $@ `G` 8$$ $84 $aX+ @ +`!l@ ` ?0$8@JaX+ @ !l(`@ #`s#0a@I&yaX? aX㿐!!X`s@#@@X!X`.`@(`%#sl@`@Jc`?s@#p@B㿈`2&@ `*" $`Hs`F`T", `\1(`c\@$ G&& bV bp(`  !sc@ "@"ss#( `GÀ`G `H`F s$ G## sss#ג!bA`a &@bTC``&@bȀ`bH&@#`!"h@LͰ`~c|&@bǀ`v`t&@`8@`ncl&@`C`fa0d&@!"`?1 @@' H3? @"`?   a$ `B`h@&@ " " %4 "s `Gڀ`I" $@   $%``@s` @'````,`"À``a &@@ @ @a `$ s@#s!'c@0b @ @ `$@ t@א s!'pc@ 0#`!"d@LMΰ``&@s!(t@ Hblڀ`b&@€`cCc&@bA`cd&@bhA`c&@`C``&@bW``&@x#% 2"d?`C a$`&"h?`7 a$`G`= $`$@ '(!!tt@G !aphz@8#'s]')#@ `"t `$@' M'#@`$s'gD!t@ D !Ȓ!s#<'s'3!t@!3\$$$$$$$Œ$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$|$$$$$$$$$$$l4 Ġ@ 'D' 'D`"#("c, DDD` R "c,`"#(+`8a<@b`D` `GtD` `F @v!0s!#kc@D`D` {#` `G`I" $@" '`ϰ  $`0`$@ h0'D'` `@'DDDP`` D` c,#c( "`@a! n 2+sD@`D@`D@ `# Dj`` `'ǀ`Dat`" !b`#Ta†`" tc`c`s! # t!x@ D``#`DZ˰ 0ID``#`DT 0AD``#`DY߰ 09Dat` "b`#Ta`tc`c`"s!ϒ"tĐ!Db؂` "bԀ`s!#:t!D`D` `@ C dD`D``" D`D`  `ss##[DD D`# #`װ DD D`# #`̰ Db؂` "bԀ`"0s!o#/td"(D `D# @  cD@ "Ws `G2`I"M $@ ' $` @ $` c ! @@!!' ' ' ' ' ' ' ' ' $' (' ,'t`D"t'@ @ `` `@%!耢 ʀ s=`@ @ t" `,"t ` ` ` ` ` ` ` ` `$ `(0 !!' ' ' ' ' ' ' ' ' $' (' ,'D`t` "t@D'0`` `@Ȑ!耢  _ `s@`` ``@ 4  0!!' ' ' ' ' ' ' ' ' $' (' ,'t`D"t'`` `@!耢  : ;s`@ @ t" `,"t ` ` ` ` ` ` ` ` `$ `( 'D`` 'b'ݒ '`` ``}`'@ *  J''@ `+` )t's`4 $$@"X@"  $``!!' ' ' ' ' ' ' ' ' $' (' ,'D!t`#!t`"D'@ ' `G`I" $@g `@''`'`K@>'` `.7@` `Pd$h  ` `? b r@D q 2    82  ' $`I``"@!耢 Ӏ u``'D'` @`'`!D@ @ 0`?'`'@%`C!!|` #adah@ (`!d@  a|* #!!' ' ' ' ' ' ' ' ' $' (' ,'" #D``t ``"!d`GU"tD``@`$KD``'D''@. `# v@(`+`  Ŕ ` @@!耢   s@`'@ t‚ `,"t ` ` ` ` ` ` ` ` `$ `("b`` t@g"hs!"c``ǰ 0$`\ @ @ `'@'``#`@t!耢 퀢 `'ꀢ Pss#R"D`|`  Bss#D"aѐ 6ss#8"vf0`$@ ]]`$@ ΐs# ! ss##mhC 0?h0@2ss#"*@ϐ!Hs!#c@ 4a@!s!"c@ 4a sad`"  E!d`aX`  /!X` 0ad`"  .!d`aX`  !X` 0D`` 0 s`$`/ 0$`( !ta#a#!t" " " " " " " " " $" (" , @r nss#o"H $ah@H 0 3$!|s!&7^t@1" @?cah@ttbQ*@k !!ϒ s#B"Ԁ s '0{@@$ah@*` $!|s!͒&<! ad`"  !d`aX`  z!X`s! #8t#s##Rss#! `G<`I"4 $@ '`$`# b"@ s!#-tؐ#0s"ܐ!t@"@cttc`pD $`2 $#bh0`$@ Đ\XTHHHHH(HH|TX4 \ѐ|ʹHHܝ  ''` @'P`xÀ`bp `aX`x@j#aXaX+ @ al+`- @P $ aX+ @ al+`  # ` ` `@`/ 1$ $ $ `$ @t 8 ^%8$_ `* H`?F`? 2߂ TT8 GNI"u $ @ $ G `>$ `2$ `$$`$ al"x jal* @  @~*` $s&!t@~Ӑ" @~cax+` ttcx*h$ $$ F`$ $ $ @ Ct@~#! H@ T@ "F )G؀I" $@W  $`! `*2 aX+ @ al+`R   (`@aX+ @ al+`R   (`[@aX+ @ al(` tÀ bp!'!' ' ' ' ' ' ' ' ' $' (' ,'"t""' ' ' ' ' ' ' ' ' $' (' ,'"p`$'``"p#"`@T"` ap‚ `, ` ` ` ` ` ` ` ` `$ `("""ap`!#at#! `, ` ` ` ` ` ` ` ` `$ `(< <  <  <  < $ 5 $@))  `$ $2 h" $ $$  ' `M-s' Ő!t@}# aX*@ !l+`@ N `h"$@}  / al &$x`0e*  @}*  & ss#&ss#&s&!t@}_"@}mcttcxs&y!t@}L"@}Zcttcxo ȁX *"c $HsFT"q `\8@(``@Ô G$&`\&  "hs `G`I" $Ւ  $`]`2 $  "Zs `Gt`I" $’  $```2 $ 怠`F`$` h@? $` f? ` }@(``@bXV bp(` _b`" $Vu  `GÀ`GR`H`FRs$ G## fd 怠`B@(``@ `$@ `$@ ? !ho`j $h{`v $b` `$"sss#!s%!u@|\ 0i ??# c0J?? J?uaȁH ?uaȁH3s?@}?G`$@ _ ' %*     `@ uua? 0D '䀢 ¢  `G^`I" $  $` P`H? `G2`$@  $` ? ` @(```@ `G{'`$@ u $h `  ?b $  "s `G`I" $k  $(`0`h `  ?b @@ `$`2` ``" `  @ `@{ "s`@{` `   @{5`  @  $ $2 $ $`,b@   ' ?@   ' ? Cuua?ܐ0 s `G:`I"w $  $` "`?b @ @ ' `s` `G(`I"N`$ے  `GΒ`$@ Ơ͐耠`"C@?b`:`$ 5t@z s!#c@ &@  @ "s `G΀`I" $ 0! ¦ Pf  "s `Gꀠ`I"  $  $(`0`h `  ?b    2   - 8`? $`]@'5  @0̀`@ua`{u;aȀ`2wu5u`"ru0u`lu,aȀ`'uga@zn s!#c@ + u@z_ s!#c@ `$@   "' '@  "' 6' < p Б? a䀠`F$`"aȢ Jss#D%摢 J?uaЁH=@{?uaЁH+̑ ʣ*  @y s@y ߀   `2 $@ $@` $@@  G+Ð _ `G1`I"6 $  $h `  ?b " $ $``2 $ $`&@@`  @ `@ $`@`$@ Ґΐ h" $ $&@&@8`  @`  ` b @ @ u@y U@(`,@`` `@y}@ "`@` u $`2 $@yo@ymW Q eK 8uaP?` 2^ ss#b$!!Yt@y, Fѐu@y# s!H$c@ u9?q $C `$@ 2E`$@ ǐȰ`$@ QQ`$@@ ِڢ@x Ps!$`c@j@``$@ h"/(`* $h"h` h0h"(` $s#ݒ$s#ؒ$e $`$@ 0` @ ` 1`@x &`` @ @x  ` @ &` `+@s#!t@xx  ss#$Qh"y $t @xr҂ss#$!)!!%u @xQ~s!u%u $3o!t@xB"@xPcuua(ds#_$s#Z$s#U$s#P(+s$aG!t@x"@x(cuua8=s$44!t@x"@xcuua@Ɩ$"!t@w"@xcuuaHXs#$s$ !t@wݐ"@wcuuaH`s!%uy!ps!%ur!`4 hT@|,Td4DLLLLLLLLLLL @d@㿐 R ` `K'`G8`I=  $`` ;`@"  uaЁH `2 0@ `,ِ0(`` @@    $`@` 2$` @`$@ ̠ǐ`$h" $7 T $㿐b`#c`Sa䀠`' c``8@ $````%h` 7ub H   `(r`  `(lu3a@v!ؠs!ޒ(Mc@0 `  ?b "  @  `(u㿐b`#c`Sa怠`] c` b\@`$`F`@`` @+@L` Ö`I `@ `U K` @`$ 2M@%u$\b@vV  ub@vO  ub@vH   ub @vA \ $\\`%` `2 6(@"À` -@@, b\u3a@v("(s!M(kc@cu$\%"H` (@@ $` Ñ@ b\` gcՑ@㿐!"@ $# h bp`   b ""'""@ $  `<bp+@ 㿐!"h@ $# h bt`   b ""h"h"h@ $  `@bt+@ 㿐)!`` $h ` ?b 'ߐ'က6 !`. @s ူ !` +b`8#$h ` ?b   (`8``% b1uu@um"s(!bT@u b`@ububc@#a\@ ဂ@ !`$a\ z!`@uQ*` $$`!`k+``4$ယ`$@$#a\@u:*  |%!`s!(Pt@u#"@u1ca\uubE*@u Là L"` ,`8``"u`. ``I@ "u,`8``."E ,``Ø`I ` @ `" ,` L`  `@ `2 ,`8``"ruu@u"x "luL `#fu@tܓ*` S`I ` @ `",` L`  `@ `2 ,` s!( 㿐`@* a` `#b ` 㿐bT@* a` `#c b㿐! @1 $`"("`*h` Yuc( HK &"c#c" @ c#c@ @ @ @K Iu04``݀` &"  `  ?b "  @ $" @`   `&"`uc@tu   &"&"c@t("2uuc @t` ꀢ `c㿐#c@ $!Ð h "`   b " <  $c` "+@ 㿐@t@s#à`@@s` $cCc㿐@````@@s  ?@@ 㿐uu#€ #0c@ XucP@tu#X`$bX@s @scu@s#‚b$bX@su`  #@D`T㿐Nc @t3NcP@t 㿐 ,%X@`7"@` (@`"`!"H`&u - X@  ` #@`(@`#` "HX0@s "Huc@sX!"H` uu#c@@sh "H@s !㿐!uu"H#c@` @sT"H`$"HbHuu#c@ `#bHc? I   F  `8  㿀@t "êah`?2`I `Au Z%`@sɒ B`" `r&  \(@`& `p&  @(@`&  " @` `?@Quh`E$@ "@ucؐ@s@ `Ħ ucȐ@r`L  `W`:& @(@`& u#  @rޖbu`cuc `@r@r?@s#В  @r– @r̐ \`&M@@rÒ @@r@sܒ  ” bX Dc< 㿐 c E. b@* u%o#@u@rB#Ok                 @@t|8@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8@@@@@@㿐#€`0 "` `?LbLv``?!   $bLR O% (@sX@X@s )bL $bL@q"X@@"X@bL㿐`5` `\H(`b@!"L`$"L@@"L!$"L!"L`$"L` @` `H(`bL@1v° (bX @q 1v 0bX @q 1v @bX @q 1v HbX @q 1v P1v° XbX @q 1v `1v h1vܰ p1v 1v 1v° bX @qi 1v bX @qb 1v QPv``!@v `v`vbX`@qD|`@4@!v  "X@q< `m@v "X @q3 `f``!v@``@q%"X@0 )"X@rT` d!v`@q"X@`$`@2C€h` "f@@v bX @q `@1@!v  "X@p (@"X@r# %` @v Nv@!@` `.H(`b4@`   `C `?`E`? `?  !v!  @p"X@`"X(@ @ `*"R !v  "X@p!`@@v@p_!va@@p"X }Ր vaX@p"X`@@v  "X@p!hÐ "X@q@v bX @p~ `` "ubX@qbTT`(`bX@qv!pbX @pd @` _@O@vV!x7v  X@pT!@ X@ @v!bX @p@ t`v!v!vbX@p0ag`v!v!bX@qZ _` "u#@"v!@o` v!bX  @p` ` T"Lv!bX  vbX@oa`v!v!v"vݐ"vڐ"v"vԐ" vѐ"(vې"0#@!v"8B v`@@]bX3vbX@@oɓb`@p @@ `bT(` @ !v@op"hbX@ovu"@#"`@pbX@@` /@pҐ (@Xy )av°ah (  x         \`T`hX,pl`D( 㿐  `K@vbX"Ȓ @n `.㿐 -#)v'v%u+!v`$ `)"@nݐb@nb `)@$@n "Ȓ ` @nbX `2 㿐 `\J(``$@vu"@#` `*"S`v7’c` @nX  `)װ ]X@oҁ1v° (bX @n 1v @bX @n 1v HbX @n 1v 0bX @n 1v P1v XbX @nz 1v `1v߰ h1v#1v p1vְ 1vڰ 1v° bX @na 1v bX @nZ 1v u#@5#v@n# 5u#1,#@v@m#X,  bX@o`V bT(`bX@oW5X@oe $ X_@o[ ([X@oV )- ]XbT+`v7 nc%%%%%%%%'%%%%%%%%%%%%%%%%%%%%%%%%%%'%%%%%%%%%%%%%%%%%%%%%%%%%%%'p'p'L%'(%%%%%%%%%%''&&&&&&&&&t&<& &X&㿐 P `EJ(`b@vc`3E` 23bX@nА (bX@nː )bX3v@m`3bX3v@m`v`@mbX' bX@n (bX@n )vѴcvδcv˴cvȴcvu"@P#**))**㿐``1@nx"X  @ (`   v#@mK"X "X@nw @nu"XL@"X@np )@nl"X@`  >"Xv"X@m-#"X㿈'D' '#!D`$c($#,DDD` R $#,`$c(+`Mb@bL` D?`D7bX@n1 0D/0|'D'쀣`v%-1D@`&D``P`2'`D`lP`耠`X``P`,"X`'쀠`I耠`@'DDP`D` P$#,`$c(D`0D`#vbX  @l#!"LD`@$"L"Lv$"LbX  @l#Dj` Ȑ v#bX  @l0 D`%vX  @l}!#D`bL `@K$bL!vX  @ln#D``Z X  @ld#D``6 vX  @lY#bL$bLD)@ v#X  D~`'v  X@l>!!D`"L `@q$"L"Lv$"L#  @l,XD`` '` `*` @m>XvX  @l#D@G v#X  D>`vbX  @k#0D3`v#bX @k 0tw D0nw D`wbX  @kߐ 0`D`'w  X@kԐ !"LD`@$"L"Lw$"L   @kXD``  X@l 7D`@BD`` DD`` DD``#w  X@k (D``D`#wbX  @k 8!"LD`@W$"L"Lv$"LbX  @kw#DK`0D`#wbX  @ki H!"L`D$"L9@"Lw$"LbX P  @kXD*`0D`wbX X  D'쀣`@`'쀠`0D @D`0Dd`w2 hD^`w! x  @k"XD@`L"X0DN`#wbX  @k D`!> wbX  @j "L`D$"L@"Lw$"L hbXD(`w!  ˔ D@  `*"LT w'’` @jX`X@l [ߐ ]@lXX@k D@"XD@D``"X@k 0 v  "X@j#0ܐ {@kXD@`XD@`  @k֐ 0@kӐ 0D`w``@jXXbT+`w' `P`"T+`j@ D@w``@j~XX,,3l33,L,L,L1 2@23D-.h/d0d0000034$44,L,L,L3̝㿐ap`?!"X@k w`@jL"XP` bT` 1vS`@w.@@k]"XS`@"Ȓ  @j2"XS`@.w  "X@j' 1w "X @j w#ap@iѐ @j"X"X㿐` ! (`)!3w `*a3w"X @iaVbT(`"X@i@k("X"X@k# )3w㿈@j+w@i!@k0#’@ibXw%€ !0@i@ibXw  bX@iѐ!H $Pw$P ؔ bX@iƒ @. w`!X@iu@ibX$ @jbXw!h!@id@ibXwbX  @i! v$"Pw$"PbX  @i 0@jbXw㿐 `:%X@j ($ X@j ( )@jXX@j   #`X0X@j   #bX@j ( bX@j )`X@j )’`%㿐bcXc!"X"X@iJ3N@jcP㿐@hِ 㿐  @ `7@/7@7 㿐  @ `/7@/@@ /@    @   @㿈'/h` H H'``@HJ㿐/ht >   $D`  $$` $;    ?cP?c@` ``02@  @  @D#@@@ `?@    @iĒ  @ @ $@D@`@ @  $@$@@`@ $@;`  $D`  $$` $; [   2 6 *@,4   @ #@ C@ `@  #@ #@ @ ` #@ ;  *. :  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ `@ @8 ?`? @ @ ?   㿈/g "H  $D`  $$` $;  <耤@??c@V`?c@` ``04@  @  @J#@ @@ `?@d٨< @h  @ @ $@D@`@ @  $@$@@`@ $@;`  $D`  $$` $;   44,  2,@  @ #@C@ `@  #@#@@ ` #@;  * , :  @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ `@ @ `? @ @c" 肤 d ,0@ @4 @<㿐/fP` @?㿐㿠#㿠AVG_CHAIN_MAXAWK_HASHgstarray.cattempt to use scalar parameter `%s' as an arrayinternal error line %d, file: %sattempt to use function `%s' as an arrayattempt to use scalar `%s' as arrayfrom %s%s (%s: %s: can't allocate %ld bytes of memory (%s)array_vnamemessageconcat_expstr ? @ +# @grow_tablenewsymbol->type == Node_var_arraysubscript of array `%s' is null stringreference to uninitialized element `%s["%s"]'assoc_lookupbucket->ahname_strdelete: index `%s' not in array `%s'%s: empty (null) %s: table_size = %d, array_size = %d %s: empty (zero) %s: I: [len %d <%.*s>] V: []%g%.*s%s: is parameter %s: array_ref to %s %lulist->ahname_ref == 1list->ahname_str == NULLassoc_from_listlist->ahname_strdup_tableABEGINENDandasortasortiatan2bindtextdomainbreakclosecomplcontinuecosdcgettextdcngettextdeletedoelseexitexpextensionfflushforfuncfunctiongensubgetlinegsubifinindexintlengthloglshiftmatchmktimenextnextfileorprintprintfrandreturnrshiftsinsplitsprintfsqrtsrandstrftimestrtonumsubsubstrsystemsystimetolowertoupperwhilexorHHHJ)dHJ)fHJ)fHJ)>lHJ)~H2HJ)MxHJ)opI3IJ)B IJ)vI(J)>yhI8;I@9IHIP8 IXJ)4I`J) IpJ)Ix0I>!I>!IJ)XI="IJ) XI+I$IJ)<IJ)IJ*HIJ)IJ)]LIJ) EIJ)/hI7J?#JJ)hhJ4J 6J(J)C`J0:J8J)aJ@J)@JHJ) JPJ)DJXJ)J`J)DJhJ)*JxJ)tJJ) XJJ) !@JJ)1JJ)/<JJ):JJ)<J/JJ)k,D`a,E"#()*+-3468;Lpqqq<hhRTVQ<\fuaavQg=vv%xh ]a?aa<az^RtRhvhxglWXvaxavaaYaRaVRu34MZ/yVvyavaaPaRPR>lm+D }?  #odecNO#$%&,'(u{%z###########SW#H#$############ I####Z##@7#iCDEEEFFFGGGGGHIIIJJLKNMOOPPPQQRRRRRRRRRRRRRRSRRUTTTTTVVWXXXYYZZZZZ[[\\]^]__``aabbccdddddeeffgggggghhhhhhhhiiijjkklllmmmmmmmmmmmnnnnnnnooooooooooooooppqqqrssstuvwwxyz   NLOM  jrsuP_]NNnoqptlk}~]|`Nfgde hz{wxyvmcQab^-NCDYN0!5NVTY36()*Z+/NiNW7,GE XUN.4NNN]H12J9#NNINNNN6F;:$%6K">ABNN@?NN'&!-./:AA3338pqg3E`a@ v<=vvv)=*|01*~nW&LM<333333333333"wwww3w;xxyffst-ffTUV/rW21=3^_245BEFQ`ab@@@@ @$GHIhi(")JLMC 7:@x*@jk3 !3f+-.f0BBBBB EfBFE'FB , GH GHILMJLM=Q  RSTUVW  <=XYZ[\]  <=EFEF<=9 G GHILMJwLMx   <=9 =EF9 GHIJ LM EF  GHIJKLMEF  GHIJLM  P   6,01 ,*# %,()@B,<B> <<<12>B1:12,@RSTUVWXYZ[\]=0,A<00;0n0?==#<B?= =w:)*()%01567+6:.-B0 <><F<HIJK<Od = #()pq-<cA/%&'v.z12=RSTUVWXYZ[\]#*+n-346    %'*,  &%&%&'12.12"#()*+,-B 3468;<@B !#$()*+,-3456734:68;<@AB !#$()*+,-3456734:68;<@AB !#$()*+ - 3468;<@AB% %&'12.012#=()*+,-3468;<=B !#$()*+-3468;<@B#()*+-3468#;<()*+B- 3468;<=%&'.12#()*+-3468#;< ()*+-3468;<%&'.012# ()*+-3468;<%&'./12#()*+-3468;< #()*+-3468#;<()*+-3468;<()*+-3468;<8;7<=53046/B12.>?:@A  !"#$%&'()*+,-9#####W###### ######4#}# ###L##*#####W#]###E####a2)$####.##22####Q#####=j FFFF######s##P#RTY######C###20#OwL######;###b#C########-#o"##w#w2##E*w#wu####2######2###w#w##tree->type == Node_K_printf || (tree->type == Node_builtin && tree->builtin == do_sprintf)awkgram.y%s: %s: can't allocate %ld bytes of memory (%s)make_for_loopr%.*sunexpected newline or end of stringyyerrorbufcan't read sourcefile `%s' (%s)empty program text on command lineget_src_bufsource file `%s' is emptyAWKREADFUNCcan't open source file `%s' for reading (%s)tokexpandtokstartfunction `%s' called with space between name and `(', or used as a variable or an arraystring (number (%.17g) string value (number value (%.17g) ?? flags %s ) wcould not open `%s' for writing (%s)j == var_count%.*s: array, %ld elements unused variable dump_varstablesending profile to standard error%s: close failed (%s)dump_funcstabj == func_countfunction `%s': parameter `%s' shadows global variablethere were shadowed variables.shadow_funcsshadow_funcs() called twice!func_usefp->namefpregister_deferred_variabledv#: %s:%d msgid msgstr "" %s third parameter is not a changeable objectmatch: third argument is a gawk extension%s: string literal as last arg of substitute has no effectclose: second argument is a gawk extensionmsgid_plural msgstr[0] "" msgstr[1] "" use of dcgettext(_"...") is incorrect: remove leading underscore%d is invalid as number of arguments for %suse of dcngettext(_"...") is incorrect: remove leading underscoreplain `print' in BEGIN or END rule should probably be `print ""'syntax errorunterminated regexpsource file does not end in newlineinvalid char '%c' in expressioncall of `length' without parentheses is deprecated by POSIXold awk does not support the keyword `in' except after `for'non-redirected `getline' undefined inside END actionDuplicate `default' detected in switch body`return' used outside function context`%s' used in %s actionregular expression on right of comparisonregular expression on left of `~' or `!~' operatorregular expression on right of assignmenteach rule must have a pattern or an action part%s blocks must have an action part-+multistage two-way pipelines don't work`%s' is a built-in function, it cannot be redefinedregexp constant `//' looks like a C++ comment, but is notregexp constant for parameter #%d yields boolean valuefunction `%s' called but never definedfunction `%s' defined but never calleduse of non-array as arraytawk regex modifier `/.../%c' doesn't work in gawk%s: %d: tawk regex modifier `/.../%c' doesn't work in gawkunterminated regexp at end of fileunterminated regexp ends with `\' at end of fileparser stack overflowstatement may have no effect`%s' is a gawk extension`%s' is a Bell Labs extensionPOSIX does not allow `%s'`%s' is not supported in old awkgotoduplicate case values in switch body: %sinternal error line %d, file: %syylextokkeyold awk does not support multiple `BEGIN' or `END' rulesfunction `%s': can't use function name as parameter name`nextfile' is a gawk extensiondup_parmsnamesfunction `%s': parameter #%d, `%s', duplicates parameter #%dPOSIX does not allow operator `**'old awk does not support operator `**'POSIX does not allow operator `**='old awk does not support operator `**='switch_bodycase_valuesregexp constant `/%s/' looks like a C comment, but is notunterminated stringinvalid subscript expressionold awk does not support multidimensional arrayscall of `length' without parentheses is not portable(yyvsp[0].nodeval)->rnode->type == Node_expression_list`goto' considered harmful! `delete(array)' is a non-portable tawk extension`delete array' is a gawk extensionfunction name `%s' previously definedfunc_installpnamesnumeric constant `%.*s' treated as hexadecimalnumeric constant `%.*s' treated as octalbackslash not last character on lineoperator `^=' is not supported in old awkoperator `^' is not supported in old awkugh. fdopen: %s debugging read/close screwed up!builtin.c%s to "%s" failed (%s)reason unknownstandard outputinternal error line %d, file: %sexp: received non-numeric argumentexp: argument %g is out of rangefflush: cannot flush: pipe `%s' opened for reading, not writingfflush: cannot flush: file `%s' opened for reading, not writingfflush: `%s' is not an open file, pipe or co-process/dev/stderr/dev/stdoutindex: received non-string first argumentindex: received non-string second argumentint: received non-numeric argumentlength: received non-string argument`length(array)' is a gawk extensionAlog: received non-numeric argumentlog: received negative argument %g 00123456789abcdef0123456789ABCDEFi == num_args[s]printf: format specifier does not have control lettertoo many arguments supplied for format stringnot enough arguments to satisfy format string^ ran out for this one%s `%s' %*s%sarg count %ld greater than total number of supplied arguments%.0f%s: %s: can't allocate %ld bytes of memory (%s)format_treecpbufs[1].buf`h' is meaningless in awk formats; ignored`L' is meaningless in awk formats; ignored`l' is meaningless in awk formats; ignoredcpbufs[1].bufsize > 0C[s]printf: value %g is out of range for `%%%c' formatobufmust use `count$' on all formats or nonethe_argscpbufs[0].buf`h' is not permitted in POSIX awk formats`l' is not permitted in POSIX awk formats`$' not permitted after period in format`$' is not permitted in awk formatsarg count with `$' must be > 0`L' is not permitted in POSIX awk formatsno `$' supplied for positional field width or precisionprintf: no argumentsprintfsqrt: received non-numeric argumentsqrt: called with negative argument %gsubstr: start index %g is invalid, using 1substr: source string is zero lengthsubstr: length %g is not >= 0substr: start index %g is past end of stringsubstr: non-integer start index %g will be truncatedsubstr: length %g at start index %g exceeds length of first argument (%lu)substr: non-integer length %g will be truncatedsubstr: length %g too big for string indexing, truncating to %gsubstr: length %g is not >= 1do_substrsubstr?AAA%a %b %d %H:%M:%S %Z %Ystrftime: received non-numeric second argumentstrftime: received non-string first argumentstrftime: received empty format stringdo_strftimebufpmktime: received non-string argument%ld %d %d %d %d %d %dsystem: received non-string argumentprintdo_printtreference to uninitialized field `$%d'wide_tolower_touppertolower: received non-string argumenttoupper: received non-string argumentatan2: received non-numeric first argumentatan2: received non-numeric second argumentsin: received non-numeric argumentcos: received non-numeric argumentAsrand: received non-numeric argument%ddo_matchbufmatch: third argument is not an arrayA?\\\&\\&sub_commonmb_indicesgensub: third argument of 0 treated as 1?Alshift: received non-numeric first argumentlshift: received non-numeric second argumentlshift(%lf, %lf): negative values will give strange resultslshift(%lf, %lf): fractional values will be truncatedlshift(%lf, %lf): too large shift value will give strange results@Prshift: received non-numeric first argumentrshift: received non-numeric second argumentrshift(%lf, %lf): negative values will give strange resultsrshift(%lf, %lf): fractional values will be truncatedrshift(%lf, %lf): too large shift value will give strange results@Pand: received non-numeric first argumentand: received non-numeric second argumentand(%lf, %lf): negative values will give strange resultsand(%lf, %lf): fractional values will be truncatedor: received non-numeric first argumentor: received non-numeric second argumentor(%lf, %lf): negative values will give strange resultsor(%lf, %lf): fractional values will be truncatedxor: received non-numeric first argumentxor: received non-numeric second argumentxor(%lf, %lf): negative values will give strange resultsxor(%lf, %lf): fractional values will be truncatedcompl: received non-numeric argumentcompl(%lf): negative value will give strange resultscompl(%lf): fractional value will be truncated@0@ LC_ALLLC_COLLATELC_CTYPELC_MESSAGESLC_MONETARYLC_NUMERICLC_TIMEdcgettext: `%s' is not a valid locale categoryA:alpha:]:upper:]:lower:]:digit:]:xdigit:]:space:]:punct:]:alnum:]:print:]:graph:]:cntrl:]:blank:]x0DX(lMemory exhaustedUnbalanced [Unfinished \ escapeunfinished repeat countmalformed repeat countupperlowerUnbalanced (CPOSIXNo syntax specifiedUnbalanced )׸טx|אptmemory exhaustedinternal error line %d, file: %sext.c`extension' is a gawk extensionextension: cannot open `%s' (%s) extension: library `%s': cannot call function `%s' (%s) extension: missing function nameextension: function `%s' already definedextension: can't use gawk built-in `%s' as function nameextension: illegal character `%c' in function name `%s'p%dextension: can't redefine function `%s'extension: function name `%s' previously defined%s: %s: can't allocate %ld bytes of memory (%s)make_builtinvnamesparm_namesfunction `%s': argument #%d: attempt to use array as a scalarfunction `%s': missing argument #%dfunction `%s': argument #%d: attempt to use scalar as an arrayfunction `%s' defined to take no more than %d argument(s)field.c%s: %s: can't allocate %ld bytes of memory (%s)init_fieldsfields_arrgrow_fields_arrset_recorddatabufNF != -1NF set to negative value(n->flags & WSTRCUR) == 0rebuild_recordopsinternal error line %d, file: %ssplit: null string for third arg is a gawk extensionsplit: second argument is not an arraynull string for `FS' is a gawk extensionold awk does not support regexps as value of `FS'FS[%c ]invalid FIELDWIDTHS value, near `%s'FIELDWIDTHS`FIELDWIDTHS' is a gawk extensionset_FIELDWIDTHS.:/usr/pkg/share/awkAWKBUFSIZEexactposix/gawkmisc.ccan't stat fd %d (%s)%s %s `%s': could not set close-on-exec: (fcntl: %s)gawkmisc.c%s: %s: can't allocate %ld bytes of memory (%s)xmallocpPOSIXLY_CORRECT--%s: option `--%s' doesn't allow an argument %s: option `%c%s' doesn't allow an argument %s: unrecognized option `--%s' %s: unrecognized option `%c%s' %s: illegal option -- %c %s: invalid option -- %c %s: option `%s' requires an argument %s: option `%s' is ambiguous %s: option requires an argument -- %c %s: option `-W %s' is ambiguous %s: option `-W %s' doesn't allow an argument close of fd %d (`%s') failed (%s)RED_FILERED_PIPERED_READRED_WRITERED_APPENDRED_NOBUFRED_EOFRED_TWOWAYRED_PTYRED_SOCKETRED_TCP 0@P `pxio.cclose of `%s' failed (%s).reached system limit for open files: starting to multiplex file descriptorstoo many pipes or input files openerror writing standard error (%s)pipe flush of `%s' failed (%s).co-process flush of pipe to `%s' failed (%s).file flush of `%s' failed (%s).error writing standard output (%s)internal error line %d, file: %sfile-/dev//inet/raw/no (known) protocol supplied in special filename `%s'fd/udp/0stdinstdoutstderrtcp/file `%s' is a directory/inet/raw client not ready yet, sorry/inet/raw server not ready yet, sorryremote host and port information (%s, %s) invalidmust supply a remote port to `/inet'must supply a remote hostname to `/inet'special file name `%s' is incompletelocal port %s invalid in `/inet'%s: %s: can't allocate %ld bytes of memory (%s)spec_setupcp no explicit close of socket `%s' providedno explicit close of co-process `%s' providedno explicit close of pipe `%s' providedno explicit close of file `%s' providedclose: redirection `%s' not opened with `|&', second argument ignoredfailure status (%d) on pipe close of `%s' (%s)failure status (%d) on file close of `%s' (%s)toclose: `%.*s' is not an open file, pipe or co-processclose of redirection that was never openedfromclose: second argument must be `to' or `from'rAWKPATHdo_pathopentrypathregister_open_hookohiop_allociopdata file `%s' is emptyiop->buf/dev/fd//dev/stdin/dev/stdout/dev/stderr/dev/pid/dev/ppid/dev/pgrpid/dev/usercould not open `%s', mode `%s'cannot open file `%s' for reading (%s)use `PROCINFO[...]' instead of `/dev/user'%d %d %d %d%duse `PROCINFO["%s"]' instead of `%s'%d could not allocate more input memoryrecm.rt_start != NULLrecm.start != NULLgrow_iop_buffererror reading input file `%s': %smulticharacter value of `RS' is a gawk extensionclose of pipe failed (%s)rww%s%.*spty/dev/ptmx/dev/pty%c%x/bin/shsh-cpipeptemldtermclose of slave pty failed (%s)/dev/pty%c0socketto/frommoving pipe to stdout in child failed (dup: %s)close of stdout in child failed (%s)pty_vs_pipefull_indexmoving pipe to stdin in child failed (dup: %s)close of stdin in child failed (%s)r+close of master pty failed (%s)moving slave pty to stdin in child failed (dup: %s)moving slave pty to stdout in child failed (dup: %s)>>>expression in `%s' redirection only has numeric valueexpression for `%s' redirection has null string valueunnecessary mixing of `>' and `>>' for file `%.*s'|&|<1filename `%s' for `%s' redirection may be result of logical expressionabacan't open pipe `%s' for input (%s)can't redirect from `%s' (%s)can't open two way pipe `%s' for input/output (%s)invalid tree type %s in redirect()redirectstrrpcan't open pipe `%s' for output (%s)cannot open pipe `%s' (%s)cannot create child process for `%s' (fork: %s)can't redirect to `%s' (%s)can't open two way socket `%s' for input/output (%s)?IOP_IS_TTYIOP_IS_INTERNALIOP_NO_FREEIOP_NOFREE_OBJIOP_AT_EOFIOP_CLOSEDIOP_AT_START @%.6gawkvars.outcompattraditionallintlint-oldposixnostalgiagen-ponon-decimal-dataprofilecopyleftcopyrightfield-separatorfilere-intervalsourcedump-variablesassignversionusagehelpexecuse-lc-numericX`plxpCCFfsd(v0V8u@uHSPCONVFMTNFFIELDWIDTHSNRFNRFS RS IGNORECASEFILENAMEOFSORSOFMTRLENGTHRSTARTSUBSEPARGINDERRNORTBINMODELINTTEXTDOMAINmessagesTV@  \W ]8 X7Yla j 8(Z8GH_dhP`  X^@ `GxhGpcx G GtGU [ bmain.c%s: %s: can't allocate %ld bytes of memory (%s)add_src*dataUsage: %s [POSIX or GNU style options] -f progfile [--] file ... Usage: %s [POSIX or GNU style options] [--] %cprogram%c file ... POSIX options: GNU long options: -f progfile --file=progfile -F fs --field-separator=fs -v var=val --assign=var=val -m[fr] val -W compat --compat -W copyleft --copyleft -W copyright --copyright -W dump-variables[=file] --dump-variables[=file] -W exec=file --exec=file -W gen-po --gen-po -W help --help -W lint[=fatal] --lint[=fatal] -W lint-old --lint-old -W non-decimal-data --non-decimal-data -W profile[=file] --profile[=file] -W posix --posix -W re-interval --re-interval -W source=program-text --source=program-text -W traditional --traditional -W usage --usage -W use-lc-numeric --use-lc-numeric -W version --version To report bugs, see node `Bugs' in `gawk.info', which is section `Reporting Problems and Bugs' in the printed version. gawk is a pattern scanning and processing language. By default it reads standard input and writes standard output. Examples: gawk '{ sum += $1 }; END { print sum }' file gawk -F: '{ print $1 }' /etc/passwd error writing standard output (%s)Copyright (C) 1989, 1991-%d Free Software Foundation. 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 3 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, see http://www.gnu.org/licenses/. ENVIRONAWKPATHPROCINFOpgrpid3.1.6pidppiduideuidgidegidgroup%d`%s' is not a variable name, looking for file `%s=%s'%s: `%s' argument to `-v' not in `var=value' form C`%s' is not a legal variable namefatal error: internal errorfloating point exceptioninternal error line %d, file: %s+F:f:v:W;m:DTIDYMEMWHINY_USERSgawk/usr/pkg/lib/locale@(#)rw/dev/null%s: option requires an argument -- %c POSIXLY_CORRECT`--posix'/`--traditional' overrides `--non-decimal-data'ARGVARGCempty argument to `--source' ignoredawkprof.out`-m[fr]' option irrelevant in gawk-m option usage: `-m[fr] nnn'%s: option `-W %s' unrecognized, ignored fatalinvalid-Ft does not set FS to tab in POSIX awkrunning %s setuid root may be a security problemenvironment variable `POSIXLY_CORRECT' set: turning on `--posix'can't set binary mode on stderr (%s)can't set binary mode on stdin (%s)no program text at all!`--posix' overrides `--traditional'could not find groups: %sawk: bailing out near line 1 init_groupsetgroupsetcan't set binary mode on stdout (%s)%s: %s:cmd. line:%d: FILENAME=%s FNR=%ld) warning: error: fatal: n->type == Node_valnode.cn->wstptr != NULL%s: %s: can't allocate %ld bytes of memory (%s)more_nodesnextfreedupnoder->stptrr->ahname_strr->wstptrold != NULLold awk does not support the `\%c' escape sequenceescape sequence `\%c' treated as plain `%c'POSIX does not allow `\x' escapesno hex digits in `\x' escape sequencebackslash at end of stringmake_str_node%.0f(n->flags & (STRING|STRCUR)) != 0str2wstrn->wstptr*ptr?random: not enough state (%ld bytes); ignored. random: state info corrupted; not changed. GAWK_NO_DFAre.c()|*+?.^$\[]%s: %s: can't allocate %ld bytes of memory (%s)make_regexprprp->pat.fastmapdest%s: /%s/internal error line %d, file: %s%st->type == Node_regex*+|?RE_BACKSLASH_ESCAPE_IN_LISTSRE_BK_PLUS_QMRE_CHAR_CLASSESRE_CONTEXT_INDEP_ANCHORSRE_CONTEXT_INDEP_OPSRE_CONTEXT_INVALID_OPSRE_DOT_NEWLINERE_DOT_NOT_NULLRE_HAT_LISTS_NOT_NEWLINERE_INTERVALSRE_LIMITED_OPSRE_NEWLINE_ALTRE_NO_BK_BRACESRE_NO_BK_PARENSRE_NO_BK_REFSRE_NO_BK_VBARRE_NO_EMPTY_RANGESRE_UNMATCHED_RIGHT_PAREN_ORDRE_NO_POSIX_BACKTRACKINGRE_NO_GNU_OPSRE_DEBUGRE_INVALID_INTERVAL_ORDRE_ICASERE_CARET_ANCHORS_HERERE_CONTEXT_INVALID_DUPRE_NO_SUBp @ @P`p @ (@@Ph,Hex D_SuccessNo matchInvalid regular expressionInvalid collation characterInvalid character class nameTrailing backslashInvalid back referenceUnmatched [ or [^Unmatched ( or \(Unmatched \{Invalid content of \{\}Invalid range endMemory exhaustedInvalid preceding regular expressionPremature end of regular expressionRegular expression too bigUnmatched ) or \)!IS_EPSILON_NODE (node->token.type)regcomp.cnode->next == NULLright > -1left > -1upperalphaloweralnumcntrlspacedigitprintblankgraphpunctxdigit0_num >= 0regexec.cerr == REG_ESPACEregs_allocated == REGS_FIXEDregs->num_regs >= nregspmatch[0].rm_so == start;Zx0Nm<[y1On@v@8@NUUUAUUU@(#)GNU Awk 3.1.6Node_illegalNode_timesNode_quotientNode_modNode_plusNode_minusNode_cond_pairNode_subscriptNode_concatNode_expNode_preincrementNode_predecrementNode_postincrementNode_postdecrementNode_unary_minusNode_field_specNode_assignNode_assign_timesNode_assign_quotientNode_assign_modNode_assign_plusNode_assign_minusNode_assign_expNode_assign_concatNode_andNode_orNode_equalNode_notequalNode_lessNode_greaterNode_leqNode_geqNode_matchNode_nomatchNode_notNode_rule_listNode_rule_nodeNode_statement_listNode_switch_bodyNode_case_listNode_if_branchesNode_expression_listNode_param_listNode_K_ifNode_K_switchNode_K_caseNode_K_defaultNode_K_whileNode_K_forNode_K_arrayforNode_K_breakNode_K_continueNode_K_printNode_K_print_recNode_K_printfNode_K_nextNode_K_exitNode_K_doNode_K_returnNode_K_deleteNode_K_delete_loopNode_K_getlineNode_K_functionNode_K_nextfileNode_redirect_outputNode_redirect_appendNode_redirect_pipeNode_redirect_pipeinNode_redirect_inputNode_redirect_twowayNode_var_newNode_varNode_var_arrayNode_valNode_builtinNode_line_rangeNode_in_arrayNode_funcNode_func_callNode_cond_expNode_regexNode_dynregexNode_hashnodeNode_ahashNode_array_refNode_BINMODENode_CONVFMTNode_FIELDWIDTHSNode_FNRNode_FSNode_IGNORECASENode_LINTNode_NFNode_NRNode_OFMTNode_OFSNode_ORSNode_RSNode_SUBSEPNode_TEXTDOMAINNode_final --- this should never appear@P`pŀŐŠŰ(@XhxƐƨƸ (8HXhxLjǘǨǸ0HXhxȈȘȨȸ 0@P`pɈɘɨɸ0HXhxʈʘʨʸ(8HXpˀˈ˘˨˰˸CPOSIXunknown nodetype %deval.cbuffer overflow in genflags2strMALLOCTEMPPERMSTRINGSTRCURNUMCURNUMBERMAYBE_NUMARRAYMAXEDFUNCFIELDINTLSTRWSTRCUR (08@ H@PXhx΀Έΐ??nloops_active > 0curfcall >= 0 # Function Call Stack: # %3d. %s # -- main -- type = %s internal error line %d, file: %sattempt to field reference from non-numeric valuereference to uninitialized field `$%d'reference to uninitialized variable `%s'assignment is not allowed to result of builtin functionattempt to use array `%s' in a scalar contextattempt to reference from null stringcan't use function name `%s' as variable or arrayattempt to access field %dstatement has no effect`continue' outside a loop is not portable`continue' outside a loop is not allowed`break' outside a loop is not portable`break' outside a loop is not allowed`nextfile' cannot be called from an END rule`next' cannot be called from an END rulelist[j-1] == tfor loop: array `%s' changed size from %ld to %ld during loop execution%s: %s: can't allocate %ld bytes of memory (%s)push_forlooploop_stack`nextfile' cannot be called from a BEGIN rule`next' cannot be called from a BEGIN rulefor_looplistpush_argsfcallsfunction `%s' called with more arguments than declaredfunction `%s' not definedfcalls[curfcall].stackreference to uninitialized argument `%s'illegal type (%s) in tree_evalconcatenation: side effects in one expression have changed the length of another!assignment used in conditional contextdivision by zero attempted in `%%'division by zero attemptedtree_evaltreeliststrstrlistinterpretnvall->stptrdivision by zero attempted in `/='division by zero attempted in `%%='?`IGNORECASE' is a gawk extensionrwrwwr`BINMODE' is a gawk extensionBINMODE: arbitrary string value treated as "rw"efgEFG +-#'bad `%sFMT' specification `%s'CONVOfmt_indexfmt_listturning off `--lint' due to assignment to `LINT'invalidfatalfile != NULLprofile.cwcould not open `%s' for writing: %ssending profile to standard errorindent_level >= 0%6ld \%c" "%c %c\a%c\%03ounexpected type %s in prec_level! (SUBSEPTEXTDOMAINRSORSOFSOFMTNRNFIGNORECASEFSFNRFIELDWIDTHSCONVFMTBINMODE!~~ %s ? : %s( || = --++getlinefor (# treated internally as `delete' in %s) { %s %s' delete %s[] ! && - ^= -= += %%= /= *= illegal type (%s) in tree_eval * >= %% / == ^ - + <= > < != internal error: %s with null vname%g# this is a dynamically loaded extension functioninternal error line %d, file: %s, pp_list: got %s tree->type == Node_expression_list%s[LINTassignment is not allowed to result of builtin functionattempt to use array `%s' in a scalar context|>><|&> $0$0while () { } ; in break continue printprintfnext if () {} else { switch (case : default: nextfile exitdo { } while () returndelete %s # %ldfunction %.*s() { } # Functions, listed alphabetically in %s # gawk profile, created %s # BEGIN block(s) BEGIN { # Rule(s) # END block(s) END { @A݈ݐ|ݘ00<0H0T0`0l0x00000000000000 0,080D0P0\0h0t0000000000000~0{0x(0u40r@0oL0lX0id0fp0c|0`0]0Z0W0T0Q0N0K0H0E0B0? 0<09$06003<00H0-T0*`0'l0$x0!0000000 0 00000 0,080D0P0\0h0t000000000000000(040@0L0X0d0p0|000000000000 0|0y$0v00s<0pH0mT0j`0gl0dx0a0^0[0X0U0R0O0L0IG[s D D.H 4 oo@|oA<@ ooR@builtin(END OF FILE)<:8'?]h]Xx ]X ]X ]X]X\ \ \ [d@H 9gt>QNPaPkqj,jH6T7YqϑI 7RǤq)>Oq9NNL(Kɲ@KCS[kA.*+(){}[]|?^$\(  !"#$%&'()*+,-./0123456789:;<=>?@abcdefghijklmnopqrstuvwxyz[\]^_`abcdefghijklmnopqrstuvwxyz{|}~ \bfnrtv\zR|P =d - zR|P @ - as: Sun Compiler Common 10 Patch 09/04/2007 as: Sun Compiler Common 10 Patch 09/04/2007 @(#)SunOS 5.10 Generic January 2005as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 GCC: (GNU) 3.4.6as: Sun Compiler Common 10 Patch 09/04/2007 ld: Software Generation Utilities - Solaris Link Editors: 5.10-1.489.interp.hash.dynsym.dynstr.SUNW_version.rela.got.rela.bss.rela.plt.text.init.fini.rodata.dynamic.data.ctors.dtors.eh_frame.jcr.data.rel.local.symtab.strtab.comment.debug_abbrev.debug_info.debug_line.debug_frame.debug_pubnames.debug_aranges.debug_ranges.debug_str.shstrtab 0 0".H.H4o@|@|`-B@@$  7BAA< ABA<A< KGGQDDWDD]DD2ޘޘ4F entxx{d<4V% J/bin/pgawk-3.1.6000555 000000 000000 00000000000 11043376423 015100 1bin/pgawkustar00rootroot000000 000000 info/gawk.info000444 000000 000000 00004106043 11043376437 013613 0ustar00rootroot000000 000000 INFO-DIR-SECTION Text creation and manipulation START-INFO-DIR-ENTRY This is gawk.info, produced by makeinfo version 4.11 from gawk.texi. * Gawk: (gawk). A text scanning and processing language. END-INFO-DIR-ENTRY INFO-DIR-SECTION Individual utilities START-INFO-DIR-ENTRY * awk: (gawk)Invoking gawk. Text scanning and processing. END-INFO-DIR-ENTRY Copyright (C) 1989, 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This is Edition 3 of `GAWK: Effective AWK Programming: A User's Guide for GNU Awk', for the 3.1.6 (or later) version of the GNU implementation of AWK. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License", the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the section entitled "GNU Free Documentation License". a. "A GNU Manual" b. "You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development."  File: gawk.info, Node: Top, Next: Foreword, Up: (dir) General Introduction ******************** This file documents `awk', a program that you can use to select particular records in a file and perform operations upon them. Copyright (C) 1989, 1991, 1992, 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc. This is Edition 3 of `GAWK: Effective AWK Programming: A User's Guide for GNU Awk', for the 3.1.6 (or later) version of the GNU implementation of AWK. Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.2 or any later version published by the Free Software Foundation; with the Invariant Sections being "GNU General Public License", the Front-Cover texts being (a) (see below), and with the Back-Cover Texts being (b) (see below). A copy of the license is included in the section entitled "GNU Free Documentation License". a. "A GNU Manual" b. "You have freedom to copy and modify this GNU Manual, like GNU software. Copies published by the Free Software Foundation raise funds for GNU development." * Menu: * Foreword:: Some nice words about this Info file. * Preface:: What this Info file is about; brief history and acknowledgments. * Getting Started:: A basic introduction to using `awk'. How to run an `awk' program. Command-line syntax. * Regexp:: All about matching things using regular expressions. * Reading Files:: How to read files and manipulate fields. * Printing:: How to print using `awk'. Describes the `print' and `printf' statements. Also describes redirection of output. * Expressions:: Expressions are the basic building blocks of statements. * Patterns and Actions:: Overviews of patterns and actions. * Arrays:: The description and use of arrays. Also includes array-oriented control statements. * Functions:: Built-in and user-defined functions. * Internationalization:: Getting `gawk' to speak your language. * Advanced Features:: Stuff for advanced users, specific to `gawk'. * Invoking Gawk:: How to run `gawk'. * Library Functions:: A Library of `awk' Functions. * Sample Programs:: Many `awk' programs with complete explanations. * Language History:: The evolution of the `awk' language. * Installation:: Installing `gawk' under various operating systems. * Notes:: Notes about `gawk' extensions and possible future work. * Basic Concepts:: A very quick introduction to programming concepts. * Glossary:: An explanation of some unfamiliar terms. * Copying:: Your right to copy and distribute `gawk'. * GNU Free Documentation License:: The license for this Info file. * Index:: Concept and Variable Index. * History:: The history of `gawk' and `awk'. * Names:: What name to use to find `awk'. * This Manual:: Using this Info file. Includes sample input files that you can use. * Conventions:: Typographical Conventions. * Manual History:: Brief history of the GNU project and this Info file. * How To Contribute:: Helping to save the world. * Acknowledgments:: Acknowledgments. * Running gawk:: How to run `gawk' programs; includes command-line syntax. * One-shot:: Running a short throwaway `awk' program. * Read Terminal:: Using no input files (input from terminal instead). * Long:: Putting permanent `awk' programs in files. * Executable Scripts:: Making self-contained `awk' programs. * Comments:: Adding documentation to `gawk' programs. * Quoting:: More discussion of shell quoting issues. * Sample Data Files:: Sample data files for use in the `awk' programs illustrated in this Info file. * Very Simple:: A very simple example. * Two Rules:: A less simple one-line example using two rules. * More Complex:: A more complex example. * Statements/Lines:: Subdividing or combining statements into lines. * Other Features:: Other Features of `awk'. * When:: When to use `gawk' and when to use other things. * Regexp Usage:: How to Use Regular Expressions. * Escape Sequences:: How to write nonprinting characters. * Regexp Operators:: Regular Expression Operators. * Character Lists:: What can go between `[...]'. * GNU Regexp Operators:: Operators specific to GNU software. * Case-sensitivity:: How to do case-insensitive matching. * Leftmost Longest:: How much text matches. * Computed Regexps:: Using Dynamic Regexps. * Locales:: How the locale affects things. * Records:: Controlling how data is split into records. * Fields:: An introduction to fields. * Nonconstant Fields:: Nonconstant Field Numbers. * Changing Fields:: Changing the Contents of a Field. * Field Separators:: The field separator and how to change it. * Regexp Field Splitting:: Using regexps as the field separator. * Single Character Fields:: Making each character a separate field. * Command Line Field Separator:: Setting `FS' from the command-line. * Field Splitting Summary:: Some final points and a summary table. * Constant Size:: Reading constant width data. * Multiple Line:: Reading multi-line records. * Getline:: Reading files under explicit program control using the `getline' function. * Plain Getline:: Using `getline' with no arguments. * Getline/Variable:: Using `getline' into a variable. * Getline/File:: Using `getline' from a file. * Getline/Variable/File:: Using `getline' into a variable from a file. * Getline/Pipe:: Using `getline' from a pipe. * Getline/Variable/Pipe:: Using `getline' into a variable from a pipe. * Getline/Coprocess:: Using `getline' from a coprocess. * Getline/Variable/Coprocess:: Using `getline' into a variable from a coprocess. * Getline Notes:: Important things to know about `getline'. * Getline Summary:: Summary of `getline' Variants. * Print:: The `print' statement. * Print Examples:: Simple examples of `print' statements. * Output Separators:: The output separators and how to change them. * OFMT:: Controlling Numeric Output With `print'. * Printf:: The `printf' statement. * Basic Printf:: Syntax of the `printf' statement. * Control Letters:: Format-control letters. * Format Modifiers:: Format-specification modifiers. * Printf Examples:: Several examples. * Redirection:: How to redirect output to multiple files and pipes. * Special Files:: File name interpretation in `gawk'. `gawk' allows access to inherited file descriptors. * Special FD:: Special files for I/O. * Special Process:: Special files for process information. * Special Network:: Special files for network communications. * Special Caveats:: Things to watch out for. * Close Files And Pipes:: Closing Input and Output Files and Pipes. * Constants:: String, numeric and regexp constants. * Scalar Constants:: Numeric and string constants. * Nondecimal-numbers:: What are octal and hex numbers. * Regexp Constants:: Regular Expression constants. * Using Constant Regexps:: When and how to use a regexp constant. * Variables:: Variables give names to values for later use. * Using Variables:: Using variables in your programs. * Assignment Options:: Setting variables on the command-line and a summary of command-line syntax. This is an advanced method of input. * Conversion:: The conversion of strings to numbers and vice versa. * Arithmetic Ops:: Arithmetic operations (`+', `-', etc.) * Concatenation:: Concatenating strings. * Assignment Ops:: Changing the value of a variable or a field. * Increment Ops:: Incrementing the numeric value of a variable. * Truth Values:: What is ``true'' and what is ``false''. * Typing and Comparison:: How variables acquire types and how this affects comparison of numbers and strings with `<', etc. * Variable Typing:: String type versus numeric type. * Comparison Operators:: The comparison operators. * Boolean Ops:: Combining comparison expressions using boolean operators `||' (``or''), `&&' (``and'') and `!' (``not''). * Conditional Exp:: Conditional expressions select between two subexpressions under control of a third subexpression. * Function Calls:: A function call is an expression. * Precedence:: How various operators nest. * Pattern Overview:: What goes into a pattern. * Regexp Patterns:: Using regexps as patterns. * Expression Patterns:: Any expression can be used as a pattern. * Ranges:: Pairs of patterns specify record ranges. * BEGIN/END:: Specifying initialization and cleanup rules. * Using BEGIN/END:: How and why to use BEGIN/END rules. * I/O And BEGIN/END:: I/O issues in BEGIN/END rules. * Empty:: The empty pattern, which matches every record. * Using Shell Variables:: How to use shell variables with `awk'. * Action Overview:: What goes into an action. * Statements:: Describes the various control statements in detail. * If Statement:: Conditionally execute some `awk' statements. * While Statement:: Loop until some condition is satisfied. * Do Statement:: Do specified action while looping until some condition is satisfied. * For Statement:: Another looping statement, that provides initialization and increment clauses. * Switch Statement:: Switch/case evaluation for conditional execution of statements based on a value. * Break Statement:: Immediately exit the innermost enclosing loop. * Continue Statement:: Skip to the end of the innermost enclosing loop. * Next Statement:: Stop processing the current input record. * Nextfile Statement:: Stop processing the current file. * Exit Statement:: Stop execution of `awk'. * Built-in Variables:: Summarizes the built-in variables. * User-modified:: Built-in variables that you change to control `awk'. * Auto-set:: Built-in variables where `awk' gives you information. * ARGC and ARGV:: Ways to use `ARGC' and `ARGV'. * Array Intro:: Introduction to Arrays * Reference to Elements:: How to examine one element of an array. * Assigning Elements:: How to change an element of an array. * Array Example:: Basic Example of an Array * Scanning an Array:: A variation of the `for' statement. It loops through the indices of an array's existing elements. * Delete:: The `delete' statement removes an element from an array. * Numeric Array Subscripts:: How to use numbers as subscripts in `awk'. * Uninitialized Subscripts:: Using Uninitialized variables as subscripts. * Multi-dimensional:: Emulating multidimensional arrays in `awk'. * Multi-scanning:: Scanning multidimensional arrays. * Array Sorting:: Sorting array values and indices. * Built-in:: Summarizes the built-in functions. * Calling Built-in:: How to call built-in functions. * Numeric Functions:: Functions that work with numbers, including `int', `sin' and `rand'. * String Functions:: Functions for string manipulation, such as `split', `match' and `sprintf'. * Gory Details:: More than you want to know about `\' and `&' with `sub', `gsub', and `gensub'. * I/O Functions:: Functions for files and shell commands. * Time Functions:: Functions for dealing with timestamps. * Bitwise Functions:: Functions for bitwise operations. * I18N Functions:: Functions for string translation. * User-defined:: Describes User-defined functions in detail. * Definition Syntax:: How to write definitions and what they mean. * Function Example:: An example function definition and what it does. * Function Caveats:: Things to watch out for. * Return Statement:: Specifying the value a function returns. * Dynamic Typing:: How variable types can change at runtime. * I18N and L10N:: Internationalization and Localization. * Explaining gettext:: How GNU `gettext' works. * Programmer i18n:: Features for the programmer. * Translator i18n:: Features for the translator. * String Extraction:: Extracting marked strings. * Printf Ordering:: Rearranging `printf' arguments. * I18N Portability:: `awk'-level portability issues. * I18N Example:: A simple i18n example. * Gawk I18N:: `gawk' is also internationalized. * Nondecimal Data:: Allowing nondecimal input data. * Two-way I/O:: Two-way communications with another process. * TCP/IP Networking:: Using `gawk' for network programming. * Portal Files:: Using `gawk' with BSD portals. * Profiling:: Profiling your `awk' programs. * Command Line:: How to run `awk'. * Options:: Command-line options and their meanings. * Other Arguments:: Input file names and variable assignments. * AWKPATH Variable:: Searching directories for `awk' programs. * Obsolete:: Obsolete Options and/or features. * Undocumented:: Undocumented Options and Features. * Known Bugs:: Known Bugs in `gawk'. * Library Names:: How to best name private global variables in library functions. * General Functions:: Functions that are of general use. * Nextfile Function:: Two implementations of a `nextfile' function. * Assert Function:: A function for assertions in `awk' programs. * Round Function:: A function for rounding if `sprintf' does not do it correctly. * Cliff Random Function:: The Cliff Random Number Generator. * Ordinal Functions:: Functions for using characters as numbers and vice versa. * Join Function:: A function to join an array into a string. * Gettimeofday Function:: A function to get formatted times. * Data File Management:: Functions for managing command-line data files. * Filetrans Function:: A function for handling data file transitions. * Rewind Function:: A function for rereading the current file. * File Checking:: Checking that data files are readable. * Empty Files:: Checking for zero-length files. * Ignoring Assigns:: Treating assignments as file names. * Getopt Function:: A function for processing command-line arguments. * Passwd Functions:: Functions for getting user information. * Group Functions:: Functions for getting group information. * Running Examples:: How to run these examples. * Clones:: Clones of common utilities. * Cut Program:: The `cut' utility. * Egrep Program:: The `egrep' utility. * Id Program:: The `id' utility. * Split Program:: The `split' utility. * Tee Program:: The `tee' utility. * Uniq Program:: The `uniq' utility. * Wc Program:: The `wc' utility. * Miscellaneous Programs:: Some interesting `awk' programs. * Dupword Program:: Finding duplicated words in a document. * Alarm Program:: An alarm clock. * Translate Program:: A program similar to the `tr' utility. * Labels Program:: Printing mailing labels. * Word Sorting:: A program to produce a word usage count. * History Sorting:: Eliminating duplicate entries from a history file. * Extract Program:: Pulling out programs from Texinfo source files. * Simple Sed:: A Simple Stream Editor. * Igawk Program:: A wrapper for `awk' that includes files. * V7/SVR3.1:: The major changes between V7 and System V Release 3.1. * SVR4:: Minor changes between System V Releases 3.1 and 4. * POSIX:: New features from the POSIX standard. * BTL:: New features from the Bell Laboratories version of `awk'. * POSIX/GNU:: The extensions in `gawk' not in POSIX `awk'. * Contributors:: The major contributors to `gawk'. * Gawk Distribution:: What is in the `gawk' distribution. * Getting:: How to get the distribution. * Extracting:: How to extract the distribution. * Distribution contents:: What is in the distribution. * Unix Installation:: Installing `gawk' under various versions of Unix. * Quick Installation:: Compiling `gawk' under Unix. * Additional Configuration Options:: Other compile-time options. * Configuration Philosophy:: How it's all supposed to work. * Non-Unix Installation:: Installation on Other Operating Systems. * Amiga Installation:: Installing `gawk' on an Amiga. * BeOS Installation:: Installing `gawk' on BeOS. * PC Installation:: Installing and Compiling `gawk' on MS-DOS and OS/2. * PC Binary Installation:: Installing a prepared distribution. * PC Compiling:: Compiling `gawk' for MS-DOS, Windows32, and OS/2. * PC Using:: Running `gawk' on MS-DOS, Windows32 and OS/2. * PC Dynamic:: Compiling `gawk' for dynamic libraries. * Cygwin:: Building and running `gawk' for Cygwin. * VMS Installation:: Installing `gawk' on VMS. * VMS Compilation:: How to compile `gawk' under VMS. * VMS Installation Details:: How to install `gawk' under VMS. * VMS Running:: How to run `gawk' under VMS. * VMS POSIX:: Alternate instructions for VMS POSIX. * VMS Old Gawk:: An old version comes with some VMS systems. * Unsupported:: Systems whose ports are no longer supported. * Atari Installation:: Installing `gawk' on the Atari ST. * Atari Compiling:: Compiling `gawk' on Atari. * Atari Using:: Running `gawk' on Atari. * Tandem Installation:: Installing `gawk' on a Tandem. * Bugs:: Reporting Problems and Bugs. * Other Versions:: Other freely available `awk' implementations. * Compatibility Mode:: How to disable certain `gawk' extensions. * Additions:: Making Additions To `gawk'. * Adding Code:: Adding code to the main body of `gawk'. * New Ports:: Porting `gawk' to a new operating system. * Dynamic Extensions:: Adding new built-in functions to `gawk'. * Internals:: A brief look at some `gawk' internals. * Sample Library:: A example of new functions. * Internal File Description:: What the new functions will do. * Internal File Ops:: The code for internal file operations. * Using Internal File Ops:: How to use an external extension. * Future Extensions:: New features that may be implemented one day. * Basic High Level:: The high level view. * Basic Data Typing:: A very quick intro to data types. * Floating Point Issues:: Stuff to know about floating-point numbers. * String Conversion Precision:: The String Value Can Lie. * Unexpected Results:: Floating Point Numbers Are Not Abstract Numbers. * POSIX Floating Point Problems:: Standards Versus Existing Practice. To Miriam, for making me complete. To Chana, for the joy you bring us. To Rivka, for the exponential increase. To Nachum, for the added dimension. To Malka, for the new beginning.  File: gawk.info, Node: Foreword, Next: Preface, Prev: Top, Up: Top Foreword ******** Arnold Robbins and I are good friends. We were introduced 11 years ago by circumstances--and our favorite programming language, AWK. The circumstances started a couple of years earlier. I was working at a new job and noticed an unplugged Unix computer sitting in the corner. No one knew how to use it, and neither did I. However, a couple of days later it was running, and I was `root' and the one-and-only user. That day, I began the transition from statistician to Unix programmer. On one of many trips to the library or bookstore in search of books on Unix, I found the gray AWK book, a.k.a. Aho, Kernighan and Weinberger, `The AWK Programming Language', Addison-Wesley, 1988. AWK's simple programming paradigm--find a pattern in the input and then perform an action--often reduced complex or tedious data manipulations to few lines of code. I was excited to try my hand at programming in AWK. Alas, the `awk' on my computer was a limited version of the language described in the AWK book. I discovered that my computer had "old `awk'" and the AWK book described "new `awk'." I learned that this was typical; the old version refused to step aside or relinquish its name. If a system had a new `awk', it was invariably called `nawk', and few systems had it. The best way to get a new `awk' was to `ftp' the source code for `gawk' from `prep.ai.mit.edu'. `gawk' was a version of new `awk' written by David Trueman and Arnold, and available under the GNU General Public License. (Incidentally, it's no longer difficult to find a new `awk'. `gawk' ships with Linux, and you can download binaries or source code for almost any system; my wife uses `gawk' on her VMS box.) My Unix system started out unplugged from the wall; it certainly was not plugged into a network. So, oblivious to the existence of `gawk' and the Unix community in general, and desiring a new `awk', I wrote my own, called `mawk'. Before I was finished I knew about `gawk', but it was too late to stop, so I eventually posted to a `comp.sources' newsgroup. A few days after my posting, I got a friendly email from Arnold introducing himself. He suggested we share design and algorithms and attached a draft of the POSIX standard so that I could update `mawk' to support language extensions added after publication of the AWK book. Frankly, if our roles had been reversed, I would not have been so open and we probably would have never met. I'm glad we did meet. He is an AWK expert's AWK expert and a genuinely nice person. Arnold contributes significant amounts of his expertise and time to the Free Software Foundation. This book is the `gawk' reference manual, but at its core it is a book about AWK programming that will appeal to a wide audience. It is a definitive reference to the AWK language as defined by the 1987 Bell Labs release and codified in the 1992 POSIX Utilities standard. On the other hand, the novice AWK programmer can study a wealth of practical programs that emphasize the power of AWK's basic idioms: data driven control-flow, pattern matching with regular expressions, and associative arrays. Those looking for something new can try out `gawk''s interface to network protocols via special `/inet' files. The programs in this book make clear that an AWK program is typically much smaller and faster to develop than a counterpart written in C. Consequently, there is often a payoff to prototype an algorithm or design in AWK to get it running quickly and expose problems early. Often, the interpreted performance is adequate and the AWK prototype becomes the product. The new `pgawk' (profiling `gawk'), produces program execution counts. I recently experimented with an algorithm that for n lines of input, exhibited ~ C n^2 performance, while theory predicted ~ C n log n behavior. A few minutes poring over the `awkprof.out' profile pinpointed the problem to a single line of code. `pgawk' is a welcome addition to my programmer's toolbox. Arnold has distilled over a decade of experience writing and using AWK programs, and developing `gawk', into this book. If you use AWK or want to learn how, then read this book. Michael Brennan Author of `mawk'  File: gawk.info, Node: Preface, Next: Getting Started, Prev: Foreword, Up: Top Preface ******* Several kinds of tasks occur repeatedly when working with text files. You might want to extract certain lines and discard the rest. Or you may need to make changes wherever certain patterns appear, but leave the rest of the file alone. Writing single-use programs for these tasks in languages such as C, C++, or Pascal is time-consuming and inconvenient. Such jobs are often easier with `awk'. The `awk' utility interprets a special-purpose programming language that makes it easy to handle simple data-reformatting jobs. The GNU implementation of `awk' is called `gawk'; it is fully compatible with the System V Release 4 version of `awk'. `gawk' is also compatible with the POSIX specification of the `awk' language. This means that all properly written `awk' programs should work with `gawk'. Thus, we usually don't distinguish between `gawk' and other `awk' implementations. Using `awk' allows you to: * Manage small, personal databases * Generate reports * Validate data * Produce indexes and perform other document preparation tasks * Experiment with algorithms that you can adapt later to other computer languages In addition, `gawk' provides facilities that make it easy to: * Extract bits and pieces of data for processing * Sort data * Perform simple network communications This Info file teaches you about the `awk' language and how you can use it effectively. You should already be familiar with basic system commands, such as `cat' and `ls',(1) as well as basic shell facilities, such as input/output (I/O) redirection and pipes. Implementations of the `awk' language are available for many different computing environments. This Info file, while describing the `awk' language in general, also describes the particular implementation of `awk' called `gawk' (which stands for "GNU awk"). `gawk' runs on a broad range of Unix systems, ranging from 80386 PC-based computers up through large-scale systems, such as Crays. `gawk' has also been ported to Mac OS X, MS-DOS, Microsoft Windows (all versions) and OS/2 PCs, Atari and Amiga microcomputers, BeOS, Tandem D20, and VMS. * Menu: * History:: The history of `gawk' and `awk'. * Names:: What name to use to find `awk'. * This Manual:: Using this Info file. Includes sample input files that you can use. * Conventions:: Typographical Conventions. * Manual History:: Brief history of the GNU project and this Info file. * How To Contribute:: Helping to save the world. * Acknowledgments:: Acknowledgments. ---------- Footnotes ---------- (1) These commands are available on POSIX-compliant systems, as well as on traditional Unix-based systems. If you are using some other operating system, you still need to be familiar with the ideas of I/O redirection and pipes.  File: gawk.info, Node: History, Next: Names, Up: Preface History of `awk' and `gawk' =========================== Recipe For A Programming Language 1 part `egrep' 1 part `snobol' 2 parts `ed' 3 parts C Blend all parts well using `lex' and `yacc'. Document minimally and release. After eight years, add another part `egrep' and two more parts C. Document very well and release. The name `awk' comes from the initials of its designers: Alfred V. Aho, Peter J. Weinberger and Brian W. Kernighan. The original version of `awk' was written in 1977 at AT&T Bell Laboratories. In 1985, a new version made the programming language more powerful, introducing user-defined functions, multiple input streams, and computed regular expressions. This new version became widely available with Unix System V Release 3.1 (SVR3.1). The version in SVR4 added some new features and cleaned up the behavior in some of the "dark corners" of the language. The specification for `awk' in the POSIX Command Language and Utilities standard further clarified the language. Both the `gawk' designers and the original Bell Laboratories `awk' designers provided feedback for the POSIX specification. Paul Rubin wrote the GNU implementation, `gawk', in 1986. Jay Fenlason completed it, with advice from Richard Stallman. John Woods contributed parts of the code as well. In 1988 and 1989, David Trueman, with help from me, thoroughly reworked `gawk' for compatibility with the newer `awk'. Circa 1995, I became the primary maintainer. Current development focuses on bug fixes, performance improvements, standards compliance, and occasionally, new features. In May of 1997, Ju"rgen Kahrs felt the need for network access from `awk', and with a little help from me, set about adding features to do this for `gawk'. At that time, he also wrote the bulk of `TCP/IP Internetworking with `gawk'' (a separate document, available as part of the `gawk' distribution). His code finally became part of the main `gawk' distribution with `gawk' version 3.1. *Note Contributors::, for a complete list of those who made important contributions to `gawk'.  File: gawk.info, Node: Names, Next: This Manual, Prev: History, Up: Preface A Rose by Any Other Name ======================== The `awk' language has evolved over the years. Full details are provided in *note Language History::. The language described in this Info file is often referred to as "new `awk'" (`nawk'). Because of this, many systems have multiple versions of `awk'. Some systems have an `awk' utility that implements the original version of the `awk' language and a `nawk' utility for the new version. Others have an `oawk' version for the "old `awk'" language and plain `awk' for the new one. Still others only have one version, which is usually the new one.(1) All in all, this makes it difficult for you to know which version of `awk' you should run when writing your programs. The best advice I can give here is to check your local documentation. Look for `awk', `oawk', and `nawk', as well as for `gawk'. It is likely that you already have some version of new `awk' on your system, which is what you should use when running your programs. (Of course, if you're reading this Info file, chances are good that you have `gawk'!) Throughout this Info file, whenever we refer to a language feature that should be available in any complete implementation of POSIX `awk', we simply use the term `awk'. When referring to a feature that is specific to the GNU implementation, we use the term `gawk'. ---------- Footnotes ---------- (1) Often, these systems use `gawk' for their `awk' implementation!  File: gawk.info, Node: This Manual, Next: Conventions, Prev: Names, Up: Preface Using This Book =============== The term `awk' refers to a particular program as well as to the language you use to tell this program what to do. When we need to be careful, we call the language "the `awk' language," and the program "the `awk' utility." This Info file explains both the `awk' language and how to run the `awk' utility. The term "`awk' program" refers to a program written by you in the `awk' programming language. Primarily, this Info file explains the features of `awk', as defined in the POSIX standard. It does so in the context of the `gawk' implementation. While doing so, it also attempts to describe important differences between `gawk' and other `awk' implementations.(1) Finally, any `gawk' features that are not in the POSIX standard for `awk' are noted. There are subsections labelled as *Advanced Notes* scattered throughout the Info file. They add a more complete explanation of points that are relevant, but not likely to be of interest on first reading. All appear in the index, under the heading "advanced features." Most of the time, the examples use complete `awk' programs. In some of the more advanced sections, only the part of the `awk' program that illustrates the concept currently being described is shown. While this Info file is aimed principally at people who have not been exposed to `awk', there is a lot of information here that even the `awk' expert should find useful. In particular, the description of POSIX `awk' and the example programs in *note Library Functions::, and in *note Sample Programs::, should be of interest. *note Getting Started::, provides the essentials you need to know to begin using `awk'. *note Regexp::, introduces regular expressions in general, and in particular the flavors supported by POSIX `awk' and `gawk'. *note Reading Files::, describes how `awk' reads your data. It introduces the concepts of records and fields, as well as the `getline' command. I/O redirection is first described here. *note Printing::, describes how `awk' programs can produce output with `print' and `printf'. *note Expressions::, describes expressions, which are the basic building blocks for getting most things done in a program. *note Patterns and Actions::, describes how to write patterns for matching records, actions for doing something when a record is matched, and the built-in variables `awk' and `gawk' use. *note Arrays::, covers `awk''s one-and-only data structure: associative arrays. Deleting array elements and whole arrays is also described, as well as sorting arrays in `gawk'. *note Functions::, describes the built-in functions `awk' and `gawk' provide, as well as how to define your own functions. *note Internationalization::, describes special features in `gawk' for translating program messages into different languages at runtime. *note Advanced Features::, describes a number of `gawk'-specific advanced features. Of particular note are the abilities to have two-way communications with another process, perform TCP/IP networking, and profile your `awk' programs. *note Invoking Gawk::, describes how to run `gawk', the meaning of its command-line options, and how it finds `awk' program source files. *note Library Functions::, and *note Sample Programs::, provide many sample `awk' programs. Reading them allows you to see `awk' solving real problems. *note Language History::, describes how the `awk' language has evolved since first release to present. It also describes how `gawk' has acquired features over time. *note Installation::, describes how to get `gawk', how to compile it under Unix, and how to compile and use it on different non-Unix systems. It also describes how to report bugs in `gawk' and where to get three other freely available implementations of `awk'. *note Notes::, describes how to disable `gawk''s extensions, as well as how to contribute new code to `gawk', how to write extension libraries, and some possible future directions for `gawk' development. *note Basic Concepts::, provides some very cursory background material for those who are completely unfamiliar with computer programming. Also centralized there is a discussion of some of the issues surrounding floating-point numbers. The *note Glossary::, defines most, if not all, the significant terms used throughout the book. If you find terms that you aren't familiar with, try looking them up here. *note Copying::, and *note GNU Free Documentation License::, present the licenses that cover the `gawk' source code and this Info file, respectively. ---------- Footnotes ---------- (1) All such differences appear in the index under the entry "differences in `awk' and `gawk'."  File: gawk.info, Node: Conventions, Next: Manual History, Prev: This Manual, Up: Preface Typographical Conventions ========================= This Info file is written using Texinfo, the GNU documentation formatting language. A single Texinfo source file is used to produce both the printed and online versions of the documentation. This minor node briefly documents the typographical conventions used in Texinfo. Examples you would type at the command-line are preceded by the common shell primary and secondary prompts, `$' and `>'. Output from the command is preceded by the glyph "-|". This typically represents the command's standard output. Error messages, and other output on the command's standard error, are preceded by the glyph "error-->". For example: $ echo hi on stdout -| hi on stdout $ echo hello on stderr 1>&2 error--> hello on stderr Characters that you type at the keyboard look `like this'. In particular, there are special characters called "control characters." These are characters that you type by holding down both the `CONTROL' key and another key, at the same time. For example, a `Ctrl-d' is typed by first pressing and holding the `CONTROL' key, next pressing the `d' key and finally releasing both keys. Dark Corners ............ Dark corners are basically fractal -- no matter how much you illuminate, there's always a smaller but darker one. Brian Kernighan Until the POSIX standard (and `The Gawk Manual'), many features of `awk' were either poorly documented or not documented at all. Descriptions of such features (often called "dark corners") are noted in this Info file with "(d.c.)". They also appear in the index under the heading "dark corner." As noted by the opening quote, though, any coverage of dark corners is, by definition, something that is incomplete.  File: gawk.info, Node: Manual History, Next: How To Contribute, Prev: Conventions, Up: Preface The GNU Project and This Book ============================= The Free Software Foundation (FSF) is a nonprofit organization dedicated to the production and distribution of freely distributable software. It was founded by Richard M. Stallman, the author of the original Emacs editor. GNU Emacs is the most widely used version of Emacs today. The GNU(1) Project is an ongoing effort on the part of the Free Software Foundation to create a complete, freely distributable, POSIX-compliant computing environment. The FSF uses the "GNU General Public License" (GPL) to ensure that their software's source code is always available to the end user. A copy of the GPL is included for your reference (*note Copying::). The GPL applies to the C language source code for `gawk'. To find out more about the FSF and the GNU Project online, see the GNU Project's home page (http://www.gnu.org). This Info file may also be read from their web site (http://www.gnu.org/software/gawk/manual/). A shell, an editor (Emacs), highly portable optimizing C, C++, and Objective-C compilers, a symbolic debugger and dozens of large and small utilities (such as `gawk'), have all been completed and are freely available. The GNU operating system kernel (the HURD), has been released but is still in an early stage of development. Until the GNU operating system is more fully developed, you should consider using GNU/Linux, a freely distributable, Unix-like operating system for Intel 80386, DEC Alpha, Sun SPARC, IBM S/390, and other systems.(2) There are many books on GNU/Linux. One that is freely available is `Linux Installation and Getting Started', by Matt Welsh. Many GNU/Linux distributions are often available in computer stores or bundled on CD-ROMs with books about Linux. (There are three other freely available, Unix-like operating systems for 80386 and other systems: NetBSD, FreeBSD, and OpenBSD. All are based on the 4.4-Lite Berkeley Software Distribution, and they use recent versions of `gawk' for their versions of `awk'.) The Info file itself has gone through a number of previous editions. Paul Rubin wrote the very first draft of `The GAWK Manual'; it was around 40 pages in size. Diane Close and Richard Stallman improved it, yielding a version that was around 90 pages long and barely described the original, "old" version of `awk'. I started working with that version in the fall of 1988. As work on it progressed, the FSF published several preliminary versions (numbered 0.X). In 1996, Edition 1.0 was released with `gawk' 3.0.0. The FSF published the first two editions under the title `The GNU Awk User's Guide'. This edition maintains the basic structure of Edition 1.0, but with significant additional material, reflecting the host of new features in `gawk' version 3.1. Of particular note is *note Array Sorting::, as well as *note Bitwise Functions::, *note Internationalization::, and also *note Advanced Features::, and *note Dynamic Extensions::. `GAWK: Effective AWK Programming' will undoubtedly continue to evolve. An electronic version comes with the `gawk' distribution from the FSF. If you find an error in this Info file, please report it! *Note Bugs::, for information on submitting problem reports electronically, or write to me in care of the publisher. ---------- Footnotes ---------- (1) GNU stands for "GNU's not Unix." (2) The terminology "GNU/Linux" is explained in the *note Glossary::.  File: gawk.info, Node: How To Contribute, Next: Acknowledgments, Prev: Manual History, Up: Preface How to Contribute ================= As the maintainer of GNU `awk', I am starting a collection of publicly available `awk' programs. For more information, see `ftp://ftp.freefriends.org/arnold/Awkstuff'. If you have written an interesting `awk' program, or have written a `gawk' extension that you would like to share with the rest of the world, please contact me (). Making things available on the Internet helps keep the `gawk' distribution down to manageable size.  File: gawk.info, Node: Acknowledgments, Prev: How To Contribute, Up: Preface Acknowledgments =============== The initial draft of `The GAWK Manual' had the following acknowledgments: Many people need to be thanked for their assistance in producing this manual. Jay Fenlason contributed many ideas and sample programs. Richard Mlynarik and Robert Chassell gave helpful comments on drafts of this manual. The paper `A Supplemental Document for `awk'' by John W. Pierce of the Chemistry Department at UC San Diego, pinpointed several issues relevant both to `awk' implementation and to this manual, that would otherwise have escaped us. I would like to acknowledge Richard M. Stallman, for his vision of a better world and for his courage in founding the FSF and starting the GNU Project. The following people (in alphabetical order) provided helpful comments on various versions of this book, up to and including this edition. Rick Adams, Nelson H.F. Beebe, Karl Berry, Dr. Michael Brennan, Rich Burridge, Claire Cloutier, Diane Close, Scott Deifik, Christopher ("Topher") Eliot, Jeffrey Friedl, Dr. Darrel Hankerson, Michal Jaegermann, Dr. Richard J. LeBlanc, Michael Lijewski, Pat Rankin, Miriam Robbins, Mary Sheehan, and Chuck Toporek. Robert J. Chassell provided much valuable advice on the use of Texinfo. He also deserves special thanks for convincing me _not_ to title this Info file `How To Gawk Politely'. Karl Berry helped significantly with the TeX part of Texinfo. I would like to thank Marshall and Elaine Hartholz of Seattle and Dr. Bert and Rita Schreiber of Detroit for large amounts of quiet vacation time in their homes, which allowed me to make significant progress on this Info file and on `gawk' itself. Phil Hughes of SSC contributed in a very important way by loaning me his laptop GNU/Linux system, not once, but twice, which allowed me to do a lot of work while away from home. David Trueman deserves special credit; he has done a yeoman job of evolving `gawk' so that it performs well and without bugs. Although he is no longer involved with `gawk', working with him on this project was a significant pleasure. The intrepid members of the GNITS mailing list, and most notably Ulrich Drepper, provided invaluable help and feedback for the design of the internationalization features. Nelson Beebe, Martin Brown, Andreas Buening, Scott Deifik, Darrel Hankerson, Isamu Hasegawa, Michal Jaegermann, Ju"rgen Kahrs, Pat Rankin, Kai Uwe Rommel, and Eli Zaretskii (in alphabetical order) make up the `gawk' "crack portability team." Without their hard work and help, `gawk' would not be nearly the fine program it is today. It has been and continues to be a pleasure working with this team of fine people. David and I would like to thank Brian Kernighan of Bell Laboratories for invaluable assistance during the testing and debugging of `gawk', and for help in clarifying numerous points about the language. We could not have done nearly as good a job on either `gawk' or its documentation without his help. Chuck Toporek, Mary Sheehan, and Claire Coutier of O'Reilly & Associates contributed significant editorial help for this Info file for the 3.1 release of `gawk'. I must thank my wonderful wife, Miriam, for her patience through the many versions of this project, for her proofreading, and for sharing me with the computer. I would like to thank my parents for their love, and for the grace with which they raised and educated me. Finally, I also must acknowledge my gratitude to G-d, for the many opportunities He has sent my way, as well as for the gifts He has given me with which to take advantage of those opportunities. Arnold Robbins Nof Ayalon ISRAEL March, 2001  File: gawk.info, Node: Getting Started, Next: Regexp, Prev: Preface, Up: Top 1 Getting Started with `awk' **************************** The basic function of `awk' is to search files for lines (or other units of text) that contain certain patterns. When a line matches one of the patterns, `awk' performs specified actions on that line. `awk' keeps processing input lines in this way until it reaches the end of the input files. Programs in `awk' are different from programs in most other languages, because `awk' programs are "data-driven"; that is, you describe the data you want to work with and then what to do when you find it. Most other languages are "procedural"; you have to describe, in great detail, every step the program is to take. When working with procedural languages, it is usually much harder to clearly describe the data your program will process. For this reason, `awk' programs are often refreshingly easy to read and write. When you run `awk', you specify an `awk' "program" that tells `awk' what to do. The program consists of a series of "rules". (It may also contain "function definitions", an advanced feature that we will ignore for now. *Note User-defined::.) Each rule specifies one pattern to search for and one action to perform upon finding the pattern. Syntactically, a rule consists of a pattern followed by an action. The action is enclosed in curly braces to separate it from the pattern. Newlines usually separate rules. Therefore, an `awk' program looks like this: PATTERN { ACTION } PATTERN { ACTION } ... * Menu: * Running gawk:: How to run `gawk' programs; includes command-line syntax. * Sample Data Files:: Sample data files for use in the `awk' programs illustrated in this Info file. * Very Simple:: A very simple example. * Two Rules:: A less simple one-line example using two rules. * More Complex:: A more complex example. * Statements/Lines:: Subdividing or combining statements into lines. * Other Features:: Other Features of `awk'. * When:: When to use `gawk' and when to use other things.  File: gawk.info, Node: Running gawk, Next: Sample Data Files, Up: Getting Started 1.1 How to Run `awk' Programs ============================= There are several ways to run an `awk' program. If the program is short, it is easiest to include it in the command that runs `awk', like this: awk 'PROGRAM' INPUT-FILE1 INPUT-FILE2 ... When the program is long, it is usually more convenient to put it in a file and run it with a command like this: awk -f PROGRAM-FILE INPUT-FILE1 INPUT-FILE2 ... This minor node discusses both mechanisms, along with several variations of each. * Menu: * One-shot:: Running a short throwaway `awk' program. * Read Terminal:: Using no input files (input from terminal instead). * Long:: Putting permanent `awk' programs in files. * Executable Scripts:: Making self-contained `awk' programs. * Comments:: Adding documentation to `gawk' programs. * Quoting:: More discussion of shell quoting issues.  File: gawk.info, Node: One-shot, Next: Read Terminal, Up: Running gawk 1.1.1 One-Shot Throwaway `awk' Programs --------------------------------------- Once you are familiar with `awk', you will often type in simple programs the moment you want to use them. Then you can write the program as the first argument of the `awk' command, like this: awk 'PROGRAM' INPUT-FILE1 INPUT-FILE2 ... where PROGRAM consists of a series of PATTERNS and ACTIONS, as described earlier. This command format instructs the "shell", or command interpreter, to start `awk' and use the PROGRAM to process records in the input file(s). There are single quotes around PROGRAM so the shell won't interpret any `awk' characters as special shell characters. The quotes also cause the shell to treat all of PROGRAM as a single argument for `awk', and allow PROGRAM to be more than one line long. This format is also useful for running short or medium-sized `awk' programs from shell scripts, because it avoids the need for a separate file for the `awk' program. A self-contained shell script is more reliable because there are no other files to misplace. *note Very Simple::, presents several short, self-contained programs.  File: gawk.info, Node: Read Terminal, Next: Long, Prev: One-shot, Up: Running gawk 1.1.2 Running `awk' Without Input Files --------------------------------------- You can also run `awk' without any input files. If you type the following command line: awk 'PROGRAM' `awk' applies the PROGRAM to the "standard input", which usually means whatever you type on the terminal. This continues until you indicate end-of-file by typing `Ctrl-d'. (On other operating systems, the end-of-file character may be different. For example, on OS/2 and MS-DOS, it is `Ctrl-z'.) As an example, the following program prints a friendly piece of advice (from Douglas Adams's `The Hitchhiker's Guide to the Galaxy'), to keep you from worrying about the complexities of computer programming (`BEGIN' is a feature we haven't discussed yet): $ awk "BEGIN { print \"Don't Panic!\" }" -| Don't Panic! This program does not read any input. The `\' before each of the inner double quotes is necessary because of the shell's quoting rules--in particular because it mixes both single quotes and double quotes.(1) This next simple `awk' program emulates the `cat' utility; it copies whatever you type on the keyboard to its standard output (why this works is explained shortly). $ awk '{ print }' Now is the time for all good men -| Now is the time for all good men to come to the aid of their country. -| to come to the aid of their country. Four score and seven years ago, ... -| Four score and seven years ago, ... What, me worry? -| What, me worry? Ctrl-d ---------- Footnotes ---------- (1) Although we generally recommend the use of single quotes around the program text, double quotes are needed here in order to put the single quote into the message.  File: gawk.info, Node: Long, Next: Executable Scripts, Prev: Read Terminal, Up: Running gawk 1.1.3 Running Long Programs --------------------------- Sometimes your `awk' programs can be very long. In this case, it is more convenient to put the program into a separate file. In order to tell `awk' to use that file for its program, you type: awk -f SOURCE-FILE INPUT-FILE1 INPUT-FILE2 ... The `-f' instructs the `awk' utility to get the `awk' program from the file SOURCE-FILE. Any file name can be used for SOURCE-FILE. For example, you could put the program: BEGIN { print "Don't Panic!" } into the file `advice'. Then this command: awk -f advice does the same thing as this one: awk "BEGIN { print \"Don't Panic!\" }" This was explained earlier (*note Read Terminal::). Note that you don't usually need single quotes around the file name that you specify with `-f', because most file names don't contain any of the shell's special characters. Notice that in `advice', the `awk' program did not have single quotes around it. The quotes are only needed for programs that are provided on the `awk' command line. If you want to identify your `awk' program files clearly as such, you can add the extension `.awk' to the file name. This doesn't affect the execution of the `awk' program but it does make "housekeeping" easier.  File: gawk.info, Node: Executable Scripts, Next: Comments, Prev: Long, Up: Running gawk 1.1.4 Executable `awk' Programs ------------------------------- Once you have learned `awk', you may want to write self-contained `awk' scripts, using the `#!' script mechanism. You can do this on many Unix systems(1) as well as on the GNU system. For example, you could update the file `advice' to look like this: #! /bin/awk -f BEGIN { print "Don't Panic!" } After making this file executable (with the `chmod' utility), simply type `advice' at the shell and the system arranges to run `awk'(2) as if you had typed `awk -f advice': $ chmod +x advice $ advice -| Don't Panic! (We assume you have the current directory in your shell's search path variable (typically `$PATH'). If not, you may need to type `./advice' at the shell.) Self-contained `awk' scripts are useful when you want to write a program that users can invoke without their having to know that the program is written in `awk'. Advanced Notes: Portability Issues with `#!' -------------------------------------------- Some systems limit the length of the interpreter name to 32 characters. Often, this can be dealt with by using a symbolic link. You should not put more than one argument on the `#!' line after the path to `awk'. It does not work. The operating system treats the rest of the line as a single argument and passes it to `awk'. Doing this leads to confusing behavior--most likely a usage diagnostic of some sort from `awk'. Finally, the value of `ARGV[0]' (*note Built-in Variables::) varies depending upon your operating system. Some systems put `awk' there, some put the full pathname of `awk' (such as `/bin/awk'), and some put the name of your script (`advice'). Don't rely on the value of `ARGV[0]' to provide your script name. ---------- Footnotes ---------- (1) The `#!' mechanism works on Linux systems, systems derived from the 4.4-Lite Berkeley Software Distribution, and most commercial Unix systems. (2) The line beginning with `#!' lists the full file name of an interpreter to run and an optional initial command-line argument to pass to that interpreter. The operating system then runs the interpreter with the given argument and the full argument list of the executed program. The first argument in the list is the full file name of the `awk' program. The rest of the argument list contains either options to `awk', or data files, or both.  File: gawk.info, Node: Comments, Next: Quoting, Prev: Executable Scripts, Up: Running gawk 1.1.5 Comments in `awk' Programs -------------------------------- A "comment" is some text that is included in a program for the sake of human readers; it is not really an executable part of the program. Comments can explain what the program does and how it works. Nearly all programming languages have provisions for comments, as programs are typically hard to understand without them. In the `awk' language, a comment starts with the sharp sign character (`#') and continues to the end of the line. The `#' does not have to be the first character on the line. The `awk' language ignores the rest of a line following a sharp sign. For example, we could have put the following into `advice': # This program prints a nice friendly message. It helps # keep novice users from being afraid of the computer. BEGIN { print "Don't Panic!" } You can put comment lines into keyboard-composed throwaway `awk' programs, but this usually isn't very useful; the purpose of a comment is to help you or another person understand the program when reading it at a later time. *Caution:* As mentioned in *note One-shot::, you can enclose small to medium programs in single quotes, in order to keep your shell scripts self-contained. When doing so, _don't_ put an apostrophe (i.e., a single quote) into a comment (or anywhere else in your program). The shell interprets the quote as the closing quote for the entire program. As a result, usually the shell prints a message about mismatched quotes, and if `awk' actually runs, it will probably print strange messages about syntax errors. For example, look at the following: $ awk '{ print "hello" } # let's be cute' > The shell sees that the first two quotes match, and that a new quoted object begins at the end of the command line. It therefore prompts with the secondary prompt, waiting for more input. With Unix `awk', closing the quoted string produces this result: $ awk '{ print "hello" } # let's be cute' > ' error--> awk: can't open file be error--> source line number 1 Putting a backslash before the single quote in `let's' wouldn't help, since backslashes are not special inside single quotes. The next node describes the shell's quoting rules.  File: gawk.info, Node: Quoting, Prev: Comments, Up: Running gawk 1.1.6 Shell-Quoting Issues -------------------------- For short to medium length `awk' programs, it is most convenient to enter the program on the `awk' command line. This is best done by enclosing the entire program in single quotes. This is true whether you are entering the program interactively at the shell prompt, or writing it as part of a larger shell script: awk 'PROGRAM TEXT' INPUT-FILE1 INPUT-FILE2 ... Once you are working with the shell, it is helpful to have a basic knowledge of shell quoting rules. The following rules apply only to POSIX-compliant, Bourne-style shells (such as `bash', the GNU Bourne-Again Shell). If you use `csh', you're on your own. * Quoted items can be concatenated with nonquoted items as well as with other quoted items. The shell turns everything into one argument for the command. * Preceding any single character with a backslash (`\') quotes that character. The shell removes the backslash and passes the quoted character on to the command. * Single quotes protect everything between the opening and closing quotes. The shell does no interpretation of the quoted text, passing it on verbatim to the command. It is _impossible_ to embed a single quote inside single-quoted text. Refer back to *note Comments::, for an example of what happens if you try. * Double quotes protect most things between the opening and closing quotes. The shell does at least variable and command substitution on the quoted text. Different shells may do additional kinds of processing on double-quoted text. Since certain characters within double-quoted text are processed by the shell, they must be "escaped" within the text. Of note are the characters `$', ``', `\', and `"', all of which must be preceded by a backslash within double-quoted text if they are to be passed on literally to the program. (The leading backslash is stripped first.) Thus, the example seen in *note Read Terminal::, is applicable: $ awk "BEGIN { print \"Don't Panic!\" }" -| Don't Panic! Note that the single quote is not special within double quotes. * Null strings are removed when they occur as part of a non-null command-line argument, while explicit non-null objects are kept. For example, to specify that the field separator `FS' should be set to the null string, use: awk -F "" 'PROGRAM' FILES # correct Don't use this: awk -F"" 'PROGRAM' FILES # wrong! In the second case, `awk' will attempt to use the text of the program as the value of `FS', and the first file name as the text of the program! This results in syntax errors at best, and confusing behavior at worst. Mixing single and double quotes is difficult. You have to resort to shell quoting tricks, like this: $ awk 'BEGIN { print "Here is a single quote <'"'"'>" }' -| Here is a single quote <'> This program consists of three concatenated quoted strings. The first and the third are single-quoted, the second is double-quoted. This can be "simplified" to: $ awk 'BEGIN { print "Here is a single quote <'\''>" }' -| Here is a single quote <'> Judge for yourself which of these two is the more readable. Another option is to use double quotes, escaping the embedded, `awk'-level double quotes: $ awk "BEGIN { print \"Here is a single quote <'>\" }" -| Here is a single quote <'> This option is also painful, because double quotes, backslashes, and dollar signs are very common in `awk' programs. A third option is to use the octal escape sequence equivalents for the single- and double-quote characters, like so: $ awk 'BEGIN { print "Here is a single quote <\47>" }' -| Here is a single quote <'> $ awk 'BEGIN { print "Here is a double quote <\42>" }' -| Here is a double quote <"> This works nicely, except that you should comment clearly what the escapes mean. A fourth option is to use command-line variable assignment, like this: $ awk -v sq="'" 'BEGIN { print "Here is a single quote <" sq ">" }' -| Here is a single quote <'> If you really need both single and double quotes in your `awk' program, it is probably best to move it into a separate file, where the shell won't be part of the picture, and you can say what you mean.  File: gawk.info, Node: Sample Data Files, Next: Very Simple, Prev: Running gawk, Up: Getting Started 1.2 Data Files for the Examples =============================== Many of the examples in this Info file take their input from two sample data files. The first, `BBS-list', represents a list of computer bulletin board systems together with information about those systems. The second data file, called `inventory-shipped', contains information about monthly shipments. In both files, each line is considered to be one "record". In the data file `BBS-list', each record contains the name of a computer bulletin board, its phone number, the board's baud rate(s), and a code for the number of hours it is operational. An `A' in the last column means the board operates 24 hours a day. A `B' in the last column means the board only operates on evening and weekend hours. A `C' means the board operates only on weekends: aardvark 555-5553 1200/300 B alpo-net 555-3412 2400/1200/300 A barfly 555-7685 1200/300 A bites 555-1675 2400/1200/300 A camelot 555-0542 300 C core 555-2912 1200/300 C fooey 555-1234 2400/1200/300 B foot 555-6699 1200/300 B macfoo 555-6480 1200/300 A sdace 555-3430 2400/1200/300 A sabafoo 555-2127 1200/300 C The data file `inventory-shipped' represents information about shipments during the year. Each record contains the month, the number of green crates shipped, the number of red boxes shipped, the number of orange bags shipped, and the number of blue packages shipped, respectively. There are 16 entries, covering the 12 months of last year and the first four months of the current year. Jan 13 25 15 115 Feb 15 32 24 226 Mar 15 24 34 228 Apr 31 52 63 420 May 16 34 29 208 Jun 31 42 75 492 Jul 24 34 67 436 Aug 15 34 47 316 Sep 13 55 37 277 Oct 29 54 68 525 Nov 20 87 82 577 Dec 17 35 61 401 Jan 21 36 64 620 Feb 26 58 80 652 Mar 24 75 70 495 Apr 21 70 74 514 If you are reading this in GNU Emacs using Info, you can copy the regions of text showing these sample files into your own test files. This way you can try out the examples shown in the remainder of this document. You do this by using the command `M-x write-region' to copy text from the Info file into a file for use with `awk' (*Note Miscellaneous File Operations: (emacs)Misc File Ops, for more information). Using this information, create your own `BBS-list' and `inventory-shipped' files and practice what you learn in this Info file. If you are using the stand-alone version of Info, see *note Extract Program::, for an `awk' program that extracts these data files from `gawk.texi', the Texinfo source file for this Info file.  File: gawk.info, Node: Very Simple, Next: Two Rules, Prev: Sample Data Files, Up: Getting Started 1.3 Some Simple Examples ======================== The following command runs a simple `awk' program that searches the input file `BBS-list' for the character string `foo' (a grouping of characters is usually called a "string"; the term "string" is based on similar usage in English, such as "a string of pearls," or "a string of cars in a train"): awk '/foo/ { print $0 }' BBS-list When lines containing `foo' are found, they are printed because `print $0' means print the current line. (Just `print' by itself means the same thing, so we could have written that instead.) You will notice that slashes (`/') surround the string `foo' in the `awk' program. The slashes indicate that `foo' is the pattern to search for. This type of pattern is called a "regular expression", which is covered in more detail later (*note Regexp::). The pattern is allowed to match parts of words. There are single quotes around the `awk' program so that the shell won't interpret any of it as special shell characters. Here is what this program prints: $ awk '/foo/ { print $0 }' BBS-list -| fooey 555-1234 2400/1200/300 B -| foot 555-6699 1200/300 B -| macfoo 555-6480 1200/300 A -| sabafoo 555-2127 1200/300 C In an `awk' rule, either the pattern or the action can be omitted, but not both. If the pattern is omitted, then the action is performed for _every_ input line. If the action is omitted, the default action is to print all lines that match the pattern. Thus, we could leave out the action (the `print' statement and the curly braces) in the previous example and the result would be the same: all lines matching the pattern `foo' are printed. By comparison, omitting the `print' statement but retaining the curly braces makes an empty action that does nothing (i.e., no lines are printed). Many practical `awk' programs are just a line or two. Following is a collection of useful, short programs to get you started. Some of these programs contain constructs that haven't been covered yet. (The description of the program will give you a good idea of what is going on, but please read the rest of the Info file to become an `awk' expert!) Most of the examples use a data file named `data'. This is just a placeholder; if you use these programs yourself, substitute your own file names for `data'. For future reference, note that there is often more than one way to do things in `awk'. At some point, you may want to look back at these examples and see if you can come up with different ways to do the same things shown here: * Print the length of the longest input line: awk '{ if (length($0) > max) max = length($0) } END { print max }' data * Print every line that is longer than 80 characters: awk 'length($0) > 80' data The sole rule has a relational expression as its pattern and it has no action--so the default action, printing the record, is used. * Print the length of the longest line in `data': expand data | awk '{ if (x < length()) x = length() } END { print "maximum line length is " x }' The input is processed by the `expand' utility to change tabs into spaces, so the widths compared are actually the right-margin columns. * Print every line that has at least one field: awk 'NF > 0' data This is an easy way to delete blank lines from a file (or rather, to create a new file similar to the old file but from which the blank lines have been removed). * Print seven random numbers from 0 to 100, inclusive: awk 'BEGIN { for (i = 1; i <= 7; i++) print int(101 * rand()) }' * Print the total number of bytes used by FILES: ls -l FILES | awk '{ x += $5 } END { print "total bytes: " x }' * Print the total number of kilobytes used by FILES: ls -l FILES | awk '{ x += $5 } END { print "total K-bytes: " (x + 1023)/1024 }' * Print a sorted list of the login names of all users: awk -F: '{ print $1 }' /etc/passwd | sort * Count the lines in a file: awk 'END { print NR }' data * Print the even-numbered lines in the data file: awk 'NR % 2 == 0' data If you use the expression `NR % 2 == 1' instead, the program would print the odd-numbered lines.  File: gawk.info, Node: Two Rules, Next: More Complex, Prev: Very Simple, Up: Getting Started 1.4 An Example with Two Rules ============================= The `awk' utility reads the input files one line at a time. For each line, `awk' tries the patterns of each of the rules. If several patterns match, then several actions are run in the order in which they appear in the `awk' program. If no patterns match, then no actions are run. After processing all the rules that match the line (and perhaps there are none), `awk' reads the next line. (However, *note Next Statement::, and also *note Nextfile Statement::). This continues until the program reaches the end of the file. For example, the following `awk' program contains two rules: /12/ { print $0 } /21/ { print $0 } The first rule has the string `12' as the pattern and `print $0' as the action. The second rule has the string `21' as the pattern and also has `print $0' as the action. Each rule's action is enclosed in its own pair of braces. This program prints every line that contains the string `12' _or_ the string `21'. If a line contains both strings, it is printed twice, once by each rule. This is what happens if we run this program on our two sample data files, `BBS-list' and `inventory-shipped': $ awk '/12/ { print $0 } > /21/ { print $0 }' BBS-list inventory-shipped -| aardvark 555-5553 1200/300 B -| alpo-net 555-3412 2400/1200/300 A -| barfly 555-7685 1200/300 A -| bites 555-1675 2400/1200/300 A -| core 555-2912 1200/300 C -| fooey 555-1234 2400/1200/300 B -| foot 555-6699 1200/300 B -| macfoo 555-6480 1200/300 A -| sdace 555-3430 2400/1200/300 A -| sabafoo 555-2127 1200/300 C -| sabafoo 555-2127 1200/300 C -| Jan 21 36 64 620 -| Apr 21 70 74 514 Note how the line beginning with `sabafoo' in `BBS-list' was printed twice, once for each rule.  File: gawk.info, Node: More Complex, Next: Statements/Lines, Prev: Two Rules, Up: Getting Started 1.5 A More Complex Example ========================== Now that we've mastered some simple tasks, let's look at what typical `awk' programs do. This example shows how `awk' can be used to summarize, select, and rearrange the output of another utility. It uses features that haven't been covered yet, so don't worry if you don't understand all the details: ls -l | awk '$6 == "Nov" { sum += $5 } END { print sum }' This command prints the total number of bytes in all the files in the current directory that were last modified in November (of any year). (1) The `ls -l' part of this example is a system command that gives you a listing of the files in a directory, including each file's size and the date the file was last modified. Its output looks like this: -rw-r--r-- 1 arnold user 1933 Nov 7 13:05 Makefile -rw-r--r-- 1 arnold user 10809 Nov 7 13:03 awk.h -rw-r--r-- 1 arnold user 983 Apr 13 12:14 awk.tab.h -rw-r--r-- 1 arnold user 31869 Jun 15 12:20 awkgram.y -rw-r--r-- 1 arnold user 22414 Nov 7 13:03 awk1.c -rw-r--r-- 1 arnold user 37455 Nov 7 13:03 awk2.c -rw-r--r-- 1 arnold user 27511 Dec 9 13:07 awk3.c -rw-r--r-- 1 arnold user 7989 Nov 7 13:03 awk4.c The first field contains read-write permissions, the second field contains the number of links to the file, and the third field identifies the owner of the file. The fourth field identifies the group of the file. The fifth field contains the size of the file in bytes. The sixth, seventh, and eighth fields contain the month, day, and time, respectively, that the file was last modified. Finally, the ninth field contains the name of the file.(2) The `$6 == "Nov"' in our `awk' program is an expression that tests whether the sixth field of the output from `ls -l' matches the string `Nov'. Each time a line has the string `Nov' for its sixth field, the action `sum += $5' is performed. This adds the fifth field (the file's size) to the variable `sum'. As a result, when `awk' has finished reading all the input lines, `sum' is the total of the sizes of the files whose lines matched the pattern. (This works because `awk' variables are automatically initialized to zero.) After the last line of output from `ls' has been processed, the `END' rule executes and prints the value of `sum'. In this example, the value of `sum' is 80600. These more advanced `awk' techniques are covered in later sections (*note Action Overview::). Before you can move on to more advanced `awk' programming, you have to know how `awk' interprets your input and displays your output. By manipulating fields and using `print' statements, you can produce some very useful and impressive-looking reports. ---------- Footnotes ---------- (1) In the C shell (`csh'), you need to type a semicolon and then a backslash at the end of the first line; see *note Statements/Lines::, for an explanation. In a POSIX-compliant shell, such as the Bourne shell or `bash', you can type the example as shown. If the command `echo $path' produces an empty output line, you are most likely using a POSIX-compliant shell. Otherwise, you are probably using the C shell or a shell derived from it. (2) On some very old systems, you may need to use `ls -lg' to get this output.  File: gawk.info, Node: Statements/Lines, Next: Other Features, Prev: More Complex, Up: Getting Started 1.6 `awk' Statements Versus Lines ================================= Most often, each line in an `awk' program is a separate statement or separate rule, like this: awk '/12/ { print $0 } /21/ { print $0 }' BBS-list inventory-shipped However, `gawk' ignores newlines after any of the following symbols and keywords: , { ? : || && do else A newline at any other point is considered the end of the statement.(1) If you would like to split a single statement into two lines at a point where a newline would terminate it, you can "continue" it by ending the first line with a backslash character (`\'). The backslash must be the final character on the line in order to be recognized as a continuation character. A backslash is allowed anywhere in the statement, even in the middle of a string or regular expression. For example: awk '/This regular expression is too long, so continue it\ on the next line/ { print $1 }' We have generally not used backslash continuation in the sample programs in this Info file. In `gawk', there is no limit on the length of a line, so backslash continuation is never strictly necessary; it just makes programs more readable. For this same reason, as well as for clarity, we have kept most statements short in the sample programs presented throughout the Info file. Backslash continuation is most useful when your `awk' program is in a separate source file instead of entered from the command line. You should also note that many `awk' implementations are more particular about where you may use backslash continuation. For example, they may not allow you to split a string constant using backslash continuation. Thus, for maximum portability of your `awk' programs, it is best not to split your lines in the middle of a regular expression or a string. *Caution:* _Backslash continuation does not work as described with the C shell._ It works for `awk' programs in files and for one-shot programs, _provided_ you are using a POSIX-compliant shell, such as the Unix Bourne shell or `bash'. But the C shell behaves differently! There, you must use two backslashes in a row, followed by a newline. Note also that when using the C shell, _every_ newline in your awk program must be escaped with a backslash. To illustrate: % awk 'BEGIN { \ ? print \\ ? "hello, world" \ ? }' -| hello, world Here, the `%' and `?' are the C shell's primary and secondary prompts, analogous to the standard shell's `$' and `>'. Compare the previous example to how it is done with a POSIX-compliant shell: $ awk 'BEGIN { > print \ > "hello, world" > }' -| hello, world `awk' is a line-oriented language. Each rule's action has to begin on the same line as the pattern. To have the pattern and action on separate lines, you _must_ use backslash continuation; there is no other option. Another thing to keep in mind is that backslash continuation and comments do not mix. As soon as `awk' sees the `#' that starts a comment, it ignores _everything_ on the rest of the line. For example: $ gawk 'BEGIN { print "dont panic" # a friendly \ > BEGIN rule > }' error--> gawk: cmd. line:2: BEGIN rule error--> gawk: cmd. line:2: ^ parse error In this case, it looks like the backslash would continue the comment onto the next line. However, the backslash-newline combination is never even noticed because it is "hidden" inside the comment. Thus, the `BEGIN' is noted as a syntax error. When `awk' statements within one rule are short, you might want to put more than one of them on a line. This is accomplished by separating the statements with a semicolon (`;'). This also applies to the rules themselves. Thus, the program shown at the start of this minor node could also be written this way: /12/ { print $0 } ; /21/ { print $0 } NOTE: The requirement that states that rules on the same line must be separated with a semicolon was not in the original `awk' language; it was added for consistency with the treatment of statements within an action. ---------- Footnotes ---------- (1) The `?' and `:' referred to here is the three-operand conditional expression described in *note Conditional Exp::. Splitting lines after `?' and `:' is a minor `gawk' extension; if `--posix' is specified (*note Options::), then this extension is disabled.  File: gawk.info, Node: Other Features, Next: When, Prev: Statements/Lines, Up: Getting Started 1.7 Other Features of `awk' =========================== The `awk' language provides a number of predefined, or "built-in", variables that your programs can use to get information from `awk'. There are other variables your program can set as well to control how `awk' processes your data. In addition, `awk' provides a number of built-in functions for doing common computational and string-related operations. `gawk' provides built-in functions for working with timestamps, performing bit manipulation, and for runtime string translation. As we develop our presentation of the `awk' language, we introduce most of the variables and many of the functions. They are defined systematically in *note Built-in Variables::, and *note Built-in::.  File: gawk.info, Node: When, Prev: Other Features, Up: Getting Started 1.8 When to Use `awk' ===================== Now that you've seen some of what `awk' can do, you might wonder how `awk' could be useful for you. By using utility programs, advanced patterns, field separators, arithmetic statements, and other selection criteria, you can produce much more complex output. The `awk' language is very useful for producing reports from large amounts of raw data, such as summarizing information from the output of other utility programs like `ls'. (*Note More Complex::.) Programs written with `awk' are usually much smaller than they would be in other languages. This makes `awk' programs easy to compose and use. Often, `awk' programs can be quickly composed at your terminal, used once, and thrown away. Because `awk' programs are interpreted, you can avoid the (usually lengthy) compilation part of the typical edit-compile-test-debug cycle of software development. Complex programs have been written in `awk', including a complete retargetable assembler for eight-bit microprocessors (*note Glossary::, for more information), and a microcode assembler for a special-purpose Prolog computer. More recently, `gawk' was used for writing a Wiki clone.(1) While the original `awk''s capabilities were strained by tasks of such complexity, modern versions are more capable. Even the Bell Labs version of `awk' has fewer predefined limits, and those that it has are much larger than they used to be. If you find yourself writing `awk' scripts of more than, say, a few hundred lines, you might consider using a different programming language. Emacs Lisp is a good choice if you need sophisticated string or pattern matching capabilities. The shell is also good at string and pattern matching; in addition, it allows powerful use of the system utilities. More conventional languages, such as C, C++, and Java, offer better facilities for system programming and for managing the complexity of large programs. Programs in these languages may require more lines of source code than the equivalent `awk' programs, but they are easier to maintain and usually run more efficiently. ---------- Footnotes ---------- (1) Yet Another Wiki Clone (http://www.awk-scripting.de/cgi-bin/wiki.cgi/yawk/).  File: gawk.info, Node: Regexp, Next: Reading Files, Prev: Getting Started, Up: Top 2 Regular Expressions ********************* A "regular expression", or "regexp", is a way of describing a set of strings. Because regular expressions are such a fundamental part of `awk' programming, their format and use deserve a separate major node. A regular expression enclosed in slashes (`/') is an `awk' pattern that matches every input record whose text belongs to that set. The simplest regular expression is a sequence of letters, numbers, or both. Such a regexp matches any string that contains that sequence. Thus, the regexp `foo' matches any string containing `foo'. Therefore, the pattern `/foo/' matches any input record containing the three characters `foo' _anywhere_ in the record. Other kinds of regexps let you specify more complicated classes of strings. * Menu: * Regexp Usage:: How to Use Regular Expressions. * Escape Sequences:: How to write nonprinting characters. * Regexp Operators:: Regular Expression Operators. * Character Lists:: What can go between `[...]'. * GNU Regexp Operators:: Operators specific to GNU software. * Case-sensitivity:: How to do case-insensitive matching. * Leftmost Longest:: How much text matches. * Computed Regexps:: Using Dynamic Regexps. * Locales:: How the locale affects things.  File: gawk.info, Node: Regexp Usage, Next: Escape Sequences, Up: Regexp 2.1 How to Use Regular Expressions ================================== A regular expression can be used as a pattern by enclosing it in slashes. Then the regular expression is tested against the entire text of each record. (Normally, it only needs to match some part of the text in order to succeed.) For example, the following prints the second field of each record that contains the string `foo' anywhere in it: $ awk '/foo/ { print $2 }' BBS-list -| 555-1234 -| 555-6699 -| 555-6480 -| 555-2127 `~' (tilde), `~' operator Regular expressions can also be used in matching expressions. These expressions allow you to specify the string to match against; it need not be the entire current input record. The two operators `~' and `!~' perform regular expression comparisons. Expressions using these operators can be used as patterns, or in `if', `while', `for', and `do' statements. (*Note Statements::.) For example: EXP ~ /REGEXP/ is true if the expression EXP (taken as a string) matches REGEXP. The following example matches, or selects, all input records with the uppercase letter `J' somewhere in the first field: $ awk '$1 ~ /J/' inventory-shipped -| Jan 13 25 15 115 -| Jun 31 42 75 492 -| Jul 24 34 67 436 -| Jan 21 36 64 620 So does this: awk '{ if ($1 ~ /J/) print }' inventory-shipped This next example is true if the expression EXP (taken as a character string) does _not_ match REGEXP: EXP !~ /REGEXP/ The following example matches, or selects, all input records whose first field _does not_ contain the uppercase letter `J': $ awk '$1 !~ /J/' inventory-shipped -| Feb 15 32 24 226 -| Mar 15 24 34 228 -| Apr 31 52 63 420 -| May 16 34 29 208 ... When a regexp is enclosed in slashes, such as `/foo/', we call it a "regexp constant", much like `5.27' is a numeric constant and `"foo"' is a string constant.  File: gawk.info, Node: Escape Sequences, Next: Regexp Operators, Prev: Regexp Usage, Up: Regexp 2.2 Escape Sequences ==================== Some characters cannot be included literally in string constants (`"foo"') or regexp constants (`/foo/'). Instead, they should be represented with "escape sequences", which are character sequences beginning with a backslash (`\'). One use of an escape sequence is to include a double-quote character in a string constant. Because a plain double quote ends the string, you must use `\"' to represent an actual double-quote character as a part of the string. For example: $ awk 'BEGIN { print "He said \"hi!\" to her." }' -| He said "hi!" to her. The backslash character itself is another character that cannot be included normally; you must write `\\' to put one backslash in the string or regexp. Thus, the string whose contents are the two characters `"' and `\' must be written `"\"\\"'. Backslash also represents unprintable characters such as TAB or newline. While there is nothing to stop you from entering most unprintable characters directly in a string constant or regexp constant, they may look ugly. The following table lists all the escape sequences used in `awk' and what they represent. Unless noted otherwise, all these escape sequences apply to both string constants and regexp constants: `\\' A literal backslash, `\'. `\a' The "alert" character, `Ctrl-g', ASCII code 7 (BEL). (This usually makes some sort of audible noise.) `\b' Backspace, `Ctrl-h', ASCII code 8 (BS). `\f' Formfeed, `Ctrl-l', ASCII code 12 (FF). `\n' Newline, `Ctrl-j', ASCII code 10 (LF). `\r' Carriage return, `Ctrl-m', ASCII code 13 (CR). `\t' Horizontal TAB, `Ctrl-i', ASCII code 9 (HT). `\v' Vertical tab, `Ctrl-k', ASCII code 11 (VT). `\NNN' The octal value NNN, where NNN stands for 1 to 3 digits between `0' and `7'. For example, the code for the ASCII ESC (escape) character is `\033'. `\xHH...' The hexadecimal value HH, where HH stands for a sequence of hexadecimal digits (`0'-`9', and either `A'-`F' or `a'-`f'). Like the same construct in ISO C, the escape sequence continues until the first nonhexadecimal digit is seen. However, using more than two hexadecimal digits produces undefined results. (The `\x' escape sequence is not allowed in POSIX `awk'.) `\/' A literal slash (necessary for regexp constants only). This expression is used when you want to write a regexp constant that contains a slash. Because the regexp is delimited by slashes, you need to escape the slash that is part of the pattern, in order to tell `awk' to keep processing the rest of the regexp. `\"' A literal double quote (necessary for string constants only). This expression is used when you want to write a string constant that contains a double quote. Because the string is delimited by double quotes, you need to escape the quote that is part of the string, in order to tell `awk' to keep processing the rest of the string. In `gawk', a number of additional two-character sequences that begin with a backslash have special meaning in regexps. *Note GNU Regexp Operators::. In a regexp, a backslash before any character that is not in the previous list and not listed in *note GNU Regexp Operators::, means that the next character should be taken literally, even if it would normally be a regexp operator. For example, `/a\+b/' matches the three characters `a+b'. For complete portability, do not use a backslash before any character not shown in the previous list. To summarize: * The escape sequences in the table above are always processed first, for both string constants and regexp constants. This happens very early, as soon as `awk' reads your program. * `gawk' processes both regexp constants and dynamic regexps (*note Computed Regexps::), for the special operators listed in *note GNU Regexp Operators::. * A backslash before any other character means to treat that character literally. Advanced Notes: Backslash Before Regular Characters --------------------------------------------------- If you place a backslash in a string constant before something that is not one of the characters previously listed, POSIX `awk' purposely leaves what happens as undefined. There are two choices: Strip the backslash out This is what Unix `awk' and `gawk' both do. For example, `"a\qc"' is the same as `"aqc"'. (Because this is such an easy bug both to introduce and to miss, `gawk' warns you about it.) Consider `FS = "[ \t]+\|[ \t]+"' to use vertical bars surrounded by whitespace as the field separator. There should be two backslashes in the string `FS = "[ \t]+\\|[ \t]+"'.) Leave the backslash alone Some other `awk' implementations do this. In such implementations, typing `"a\qc"' is the same as typing `"a\\qc"'. Advanced Notes: Escape Sequences for Metacharacters --------------------------------------------------- Suppose you use an octal or hexadecimal escape to represent a regexp metacharacter. (See *note Regexp Operators::.) Does `awk' treat the character as a literal character or as a regexp operator? Historically, such characters were taken literally. (d.c.) However, the POSIX standard indicates that they should be treated as real metacharacters, which is what `gawk' does. In compatibility mode (*note Options::), `gawk' treats the characters represented by octal and hexadecimal escape sequences literally when used in regexp constants. Thus, `/a\52b/' is equivalent to `/a\*b/'.  File: gawk.info, Node: Regexp Operators, Next: Character Lists, Prev: Escape Sequences, Up: Regexp 2.3 Regular Expression Operators ================================ You can combine regular expressions with special characters, called "regular expression operators" or "metacharacters", to increase the power and versatility of regular expressions. The escape sequences described in *note Escape Sequences::, are valid inside a regexp. They are introduced by a `\' and are recognized and converted into corresponding real characters as the very first step in processing regexps. Here is a list of metacharacters. All characters that are not escape sequences and that are not listed in the table stand for themselves: `\' This is used to suppress the special meaning of a character when matching. For example, `\$' matches the character `$'. `^' This matches the beginning of a string. For example, `^@chapter' matches `@chapter' at the beginning of a string and can be used to identify chapter beginnings in Texinfo source files. The `^' is known as an "anchor", because it anchors the pattern to match only at the beginning of the string. It is important to realize that `^' does not match the beginning of a line embedded in a string. The condition is not true in the following example: if ("line1\nLINE 2" ~ /^L/) ... `$' This is similar to `^', but it matches only at the end of a string. For example, `p$' matches a record that ends with a `p'. The `$' is an anchor and does not match the end of a line embedded in a string. The condition in the following example is not true: if ("line1\nLINE 2" ~ /1$/) ... `.' This matches any single character, _including_ the newline character. For example, `.P' matches any single character followed by a `P' in a string. Using concatenation, we can make a regular expression such as `U.A', which matches any three-character sequence that begins with `U' and ends with `A'. In strict POSIX mode (*note Options::), `.' does not match the NUL character, which is a character with all bits equal to zero. Otherwise, NUL is just another character. Other versions of `awk' may not be able to match the NUL character. `[...]' This is called a "character list".(1) It matches any _one_ of the characters that are enclosed in the square brackets. For example, `[MVX]' matches any one of the characters `M', `V', or `X' in a string. A full discussion of what can be inside the square brackets of a character list is given in *note Character Lists::. `[^ ...]' This is a "complemented character list". The first character after the `[' _must_ be a `^'. It matches any characters _except_ those in the square brackets. For example, `[^awk]' matches any character that is not an `a', `w', or `k'. `|' This is the "alternation operator" and it is used to specify alternatives. The `|' has the lowest precedence of all the regular expression operators. For example, `^P|[[:digit:]]' matches any string that matches either `^P' or `[[:digit:]]'. This means it matches any string that starts with `P' or contains a digit. The alternation applies to the largest possible regexps on either side. `(...)' Parentheses are used for grouping in regular expressions, as in arithmetic. They can be used to concatenate regular expressions containing the alternation operator, `|'. For example, `@(samp|code)\{[^}]+\}' matches both `@code{foo}' and `@samp{bar}'. (These are Texinfo formatting control sequences. The `+' is explained further on in this list.) `*' This symbol means that the preceding regular expression should be repeated as many times as necessary to find a match. For example, `ph*' applies the `*' symbol to the preceding `h' and looks for matches of one `p' followed by any number of `h's. This also matches just `p' if no `h's are present. The `*' repeats the _smallest_ possible preceding expression. (Use parentheses if you want to repeat a larger expression.) It finds as many repetitions as possible. For example, `awk '/\(c[ad][ad]*r x\)/ { print }' sample' prints every record in `sample' containing a string of the form `(car x)', `(cdr x)', `(cadr x)', and so on. Notice the escaping of the parentheses by preceding them with backslashes. `+' This symbol is similar to `*', except that the preceding expression must be matched at least once. This means that `wh+y' would match `why' and `whhy', but not `wy', whereas `wh*y' would match all three of these strings. The following is a simpler way of writing the last `*' example: awk '/\(c[ad]+r x\)/ { print }' sample `?' This symbol is similar to `*', except that the preceding expression can be matched either once or not at all. For example, `fe?d' matches `fed' and `fd', but nothing else. `{N}' `{N,}' `{N,M}' One or two numbers inside braces denote an "interval expression". If there is one number in the braces, the preceding regexp is repeated N times. If there are two numbers separated by a comma, the preceding regexp is repeated N to M times. If there is one number followed by a comma, then the preceding regexp is repeated at least N times: `wh{3}y' Matches `whhhy', but not `why' or `whhhhy'. `wh{3,5}y' Matches `whhhy', `whhhhy', or `whhhhhy', only. `wh{2,}y' Matches `whhy' or `whhhy', and so on. Interval expressions were not traditionally available in `awk'. They were added as part of the POSIX standard to make `awk' and `egrep' consistent with each other. However, because old programs may use `{' and `}' in regexp constants, by default `gawk' does _not_ match interval expressions in regexps. If either `--posix' or `--re-interval' are specified (*note Options::), then interval expressions are allowed in regexps. For new programs that use `{' and `}' in regexp constants, it is good practice to always escape them with a backslash. Then the regexp constants are valid and work the way you want them to, using any version of `awk'.(2) In regular expressions, the `*', `+', and `?' operators, as well as the braces `{' and `}', have the highest precedence, followed by concatenation, and finally by `|'. As in arithmetic, parentheses can change how operators are grouped. In POSIX `awk' and `gawk', the `*', `+', and `?' operators stand for themselves when there is nothing in the regexp that precedes them. For example, `/+/' matches a literal plus sign. However, many other versions of `awk' treat such a usage as a syntax error. If `gawk' is in compatibility mode (*note Options::), POSIX character classes and interval expressions are not available in regular expressions. ---------- Footnotes ---------- (1) In other literature, you may see a character list referred to as either a "character set", a "character class", or a "bracket expression". (2) Use two backslashes if you're using a string constant with a regexp operator or function.  File: gawk.info, Node: Character Lists, Next: GNU Regexp Operators, Prev: Regexp Operators, Up: Regexp 2.4 Using Character Lists ========================= Within a character list, a "range expression" consists of two characters separated by a hyphen. It matches any single character that sorts between the two characters, using the locale's collating sequence and character set. For example, in the default C locale, `[a-dx-z]' is equivalent to `[abcdxyz]'. Many locales sort characters in dictionary order, and in these locales, `[a-dx-z]' is typically not equivalent to `[abcdxyz]'; instead it might be equivalent to `[aBbCcDdxXyYz]', for example. To obtain the traditional interpretation of bracket expressions, you can use the C locale by setting the `LC_ALL' environment variable to the value `C'. To include one of the characters `\', `]', `-', or `^' in a character list, put a `\' in front of it. For example: [d\]] matches either `d' or `]'. This treatment of `\' in character lists is compatible with other `awk' implementations and is also mandated by POSIX. The regular expressions in `awk' are a superset of the POSIX specification for Extended Regular Expressions (EREs). POSIX EREs are based on the regular expressions accepted by the traditional `egrep' utility. "Character classes" are a new feature introduced in the POSIX standard. A character class is a special notation for describing lists of characters that have a specific attribute, but the actual characters can vary from country to country and/or from character set to character set. For example, the notion of what is an alphabetic character differs between the United States and France. A character class is only valid in a regexp _inside_ the brackets of a character list. Character classes consist of `[:', a keyword denoting the class, and `:]'. *note table-char-classes:: lists the character classes defined by the POSIX standard. Class Meaning -------------------------------------------------------------------------- `[:alnum:]' Alphanumeric characters. `[:alpha:]' Alphabetic characters. `[:blank:]' Space and TAB characters. `[:cntrl:]' Control characters. `[:digit:]' Numeric characters. `[:graph:]' Characters that are both printable and visible. (A space is printable but not visible, whereas an `a' is both.) `[:lower:]' Lowercase alphabetic characters. `[:print:]' Printable characters (characters that are not control characters). `[:punct:]' Punctuation characters (characters that are not letters, digits, control characters, or space characters). `[:space:]' Space characters (such as space, TAB, and formfeed, to name a few). `[:upper:]' Uppercase alphabetic characters. `[:xdigit:]'Characters that are hexadecimal digits. Table 2.1: POSIX Character Classes For example, before the POSIX standard, you had to write `/[A-Za-z0-9]/' to match alphanumeric characters. If your character set had other alphabetic characters in it, this would not match them, and if your character set collated differently from ASCII, this might not even match the ASCII alphanumeric characters. With the POSIX character classes, you can write `/[[:alnum:]]/' to match the alphabetic and numeric characters in your character set. Two additional special sequences can appear in character lists. These apply to non-ASCII character sets, which can have single symbols (called "collating elements") that are represented with more than one character. They can also have several characters that are equivalent for "collating", or sorting, purposes. (For example, in French, a plain "e" and a grave-accented "e`" are equivalent.) These sequences are: Collating symbols Multicharacter collating elements enclosed between `[.' and `.]'. For example, if `ch' is a collating element, then `[[.ch.]]' is a regexp that matches this collating element, whereas `[ch]' is a regexp that matches either `c' or `h'. Equivalence classes Locale-specific names for a list of characters that are equal. The name is enclosed between `[=' and `=]'. For example, the name `e' might be used to represent all of "e," "e`," and "e'." In this case, `[[=e=]]' is a regexp that matches any of `e', `e'', or `e`'. These features are very valuable in non-English-speaking locales. *Caution:* The library functions that `gawk' uses for regular expression matching currently recognize only POSIX character classes; they do not recognize collating symbols or equivalence classes.  File: gawk.info, Node: GNU Regexp Operators, Next: Case-sensitivity, Prev: Character Lists, Up: Regexp 2.5 `gawk'-Specific Regexp Operators ==================================== GNU software that deals with regular expressions provides a number of additional regexp operators. These operators are described in this minor node and are specific to `gawk'; they are not available in other `awk' implementations. Most of the additional operators deal with word matching. For our purposes, a "word" is a sequence of one or more letters, digits, or underscores (`_'): `\w' Matches any word-constituent character--that is, it matches any letter, digit, or underscore. Think of it as shorthand for `[[:alnum:]_]'. `\W' Matches any character that is not word-constituent. Think of it as shorthand for `[^[:alnum:]_]'. `\<' Matches the empty string at the beginning of a word. For example, `/\' Matches the empty string at the end of a word. For example, `/stow\>/' matches `stow' but not `stowaway'. `\y' Matches the empty string at either the beginning or the end of a word (i.e., the word boundar*y*). For example, `\yballs?\y' matches either `ball' or `balls', as a separate word. `\B' Matches the empty string that occurs between two word-constituent characters. For example, `/\Brat\B/' matches `crate' but it does not match `dirty rat'. `\B' is essentially the opposite of `\y'. There are two other operators that work on buffers. In Emacs, a "buffer" is, naturally, an Emacs buffer. For other programs, `gawk''s regexp library routines consider the entire string to match as the buffer. The operators are: `\`' Matches the empty string at the beginning of a buffer (string). `\'' Matches the empty string at the end of a buffer (string). Because `^' and `$' always work in terms of the beginning and end of strings, these operators don't add any new capabilities for `awk'. They are provided for compatibility with other GNU software. In other GNU software, the word-boundary operator is `\b'. However, that conflicts with the `awk' language's definition of `\b' as backspace, so `gawk' uses a different letter. An alternative method would have been to require two backslashes in the GNU operators, but this was deemed too confusing. The current method of using `\y' for the GNU `\b' appears to be the lesser of two evils. The various command-line options (*note Options::) control how `gawk' interprets characters in regexps: No options In the default case, `gawk' provides all the facilities of POSIX regexps and the GNU regexp operators described in *note Regexp Operators::. However, interval expressions are not supported. `--posix' Only POSIX regexps are supported; the GNU operators are not special (e.g., `\w' matches a literal `w'). Interval expressions are allowed. `--traditional' Traditional Unix `awk' regexps are matched. The GNU operators are not special, interval expressions are not available, nor are the POSIX character classes (`[[:alnum:]]', etc.). Characters described by octal and hexadecimal escape sequences are treated literally, even if they represent regexp metacharacters. Also, `gawk' silently skips directories named on the command line. `--re-interval' Allow interval expressions in regexps, even if `--traditional' has been provided. (`--posix' automatically enables interval expressions, so `--re-interval' is redundant when `--posix' is is used.)  File: gawk.info, Node: Case-sensitivity, Next: Leftmost Longest, Prev: GNU Regexp Operators, Up: Regexp 2.6 Case Sensitivity in Matching ================================ Case is normally significant in regular expressions, both when matching ordinary characters (i.e., not metacharacters) and inside character sets. Thus, a `w' in a regular expression matches only a lowercase `w' and not an uppercase `W'. The simplest way to do a case-independent match is to use a character list--for example, `[Ww]'. However, this can be cumbersome if you need to use it often, and it can make the regular expressions harder to read. There are two alternatives that you might prefer. One way to perform a case-insensitive match at a particular point in the program is to convert the data to a single case, using the `tolower' or `toupper' built-in string functions (which we haven't discussed yet; *note String Functions::). For example: tolower($1) ~ /foo/ { ... } converts the first field to lowercase before matching against it. This works in any POSIX-compliant `awk'. Another method, specific to `gawk', is to set the variable `IGNORECASE' to a nonzero value (*note Built-in Variables::). When `IGNORECASE' is not zero, _all_ regexp and string operations ignore case. Changing the value of `IGNORECASE' dynamically controls the case-sensitivity of the program as it runs. Case is significant by default because `IGNORECASE' (like most variables) is initialized to zero: x = "aB" if (x ~ /ab/) ... # this test will fail IGNORECASE = 1 if (x ~ /ab/) ... # now it will succeed In general, you cannot use `IGNORECASE' to make certain rules case-insensitive and other rules case-sensitive, because there is no straightforward way to set `IGNORECASE' just for the pattern of a particular rule.(1) To do this, use either character lists or `tolower'. However, one thing you can do with `IGNORECASE' only is dynamically turn case-sensitivity on or off for all the rules at once. `IGNORECASE' can be set on the command line or in a `BEGIN' rule (*note Other Arguments::; also *note Using BEGIN/END::). Setting `IGNORECASE' from the command line is a way to make a program case-insensitive without having to edit it. Prior to `gawk' 3.0, the value of `IGNORECASE' affected regexp operations only. It did not affect string comparison with `==', `!=', and so on. Beginning with version 3.0, both regexp and string comparison operations are also affected by `IGNORECASE'. Beginning with `gawk' 3.0, the equivalences between upper- and lowercase characters are based on the ISO-8859-1 (ISO Latin-1) character set. This character set is a superset of the traditional 128 ASCII characters, which also provides a number of characters suitable for use with European languages. As of `gawk' 3.1.4, the case equivalences are fully locale-aware. They are based on the C `' facilities, such as `isalpha()' and `toupper()'. The value of `IGNORECASE' has no effect if `gawk' is in compatibility mode (*note Options::). Case is always significant in compatibility mode. ---------- Footnotes ---------- (1) Experienced C and C++ programmers will note that it is possible, using something like `IGNORECASE = 1 && /foObAr/ { ... }' and `IGNORECASE = 0 || /foobar/ { ... }'. However, this is somewhat obscure and we don't recommend it.  File: gawk.info, Node: Leftmost Longest, Next: Computed Regexps, Prev: Case-sensitivity, Up: Regexp 2.7 How Much Text Matches? ========================== Consider the following: echo aaaabcd | awk '{ sub(/a+/, ""); print }' This example uses the `sub' function (which we haven't discussed yet; *note String Functions::) to make a change to the input record. Here, the regexp `/a+/' indicates "one or more `a' characters," and the replacement text is `'. The input contains four `a' characters. `awk' (and POSIX) regular expressions always match the leftmost, _longest_ sequence of input characters that can match. Thus, all four `a' characters are replaced with `' in this example: $ echo aaaabcd | awk '{ sub(/a+/, ""); print }' -| bcd For simple match/no-match tests, this is not so important. But when doing text matching and substitutions with the `match', `sub', `gsub', and `gensub' functions, it is very important. *Note String Functions::, for more information on these functions. Understanding this principle is also important for regexp-based record and field splitting (*note Records::, and also *note Field Separators::).  File: gawk.info, Node: Computed Regexps, Next: Locales, Prev: Leftmost Longest, Up: Regexp 2.8 Using Dynamic Regexps ========================= The righthand side of a `~' or `!~' operator need not be a regexp constant (i.e., a string of characters between slashes). It may be any expression. The expression is evaluated and converted to a string if necessary; the contents of the string are used as the regexp. A regexp that is computed in this way is called a "dynamic regexp": BEGIN { digits_regexp = "[[:digit:]]+" } $0 ~ digits_regexp { print } This sets `digits_regexp' to a regexp that describes one or more digits, and tests whether the input record matches this regexp. *Caution:* When using the `~' and `!~' operators, there is a difference between a regexp constant enclosed in slashes and a string constant enclosed in double quotes. If you are going to use a string constant, you have to understand that the string is, in essence, scanned _twice_: the first time when `awk' reads your program, and the second time when it goes to match the string on the lefthand side of the operator with the pattern on the right. This is true of any string-valued expression (such as `digits_regexp', shown previously), not just string constants. What difference does it make if the string is scanned twice? The answer has to do with escape sequences, and particularly with backslashes. To get a backslash into a regular expression inside a string, you have to type two backslashes. For example, `/\*/' is a regexp constant for a literal `*'. Only one backslash is needed. To do the same thing with a string, you have to type `"\\*"'. The first backslash escapes the second one so that the string actually contains the two characters `\' and `*'. Given that you can use both regexp and string constants to describe regular expressions, which should you use? The answer is "regexp constants," for several reasons: * String constants are more complicated to write and more difficult to read. Using regexp constants makes your programs less error-prone. Not understanding the difference between the two kinds of constants is a common source of errors. * It is more efficient to use regexp constants. `awk' can note that you have supplied a regexp and store it internally in a form that makes pattern matching more efficient. When using a string constant, `awk' must first convert the string into this internal form and then perform the pattern matching. * Using regexp constants is better form; it shows clearly that you intend a regexp match. Advanced Notes: Using `\n' in Character Lists of Dynamic Regexps ---------------------------------------------------------------- Some commercial versions of `awk' do not allow the newline character to be used inside a character list for a dynamic regexp: $ awk '$0 ~ "[ \t\n]"' error--> awk: newline in character class [ error--> ]... error--> source line number 1 error--> context is error--> >>> <<< But a newline in a regexp constant works with no problem: $ awk '$0 ~ /[ \t\n]/' here is a sample line -| here is a sample line Ctrl-d `gawk' does not have this problem, and it isn't likely to occur often in practice, but it's worth noting for future reference.  File: gawk.info, Node: Locales, Prev: Computed Regexps, Up: Regexp 2.9 Where You Are Makes A Difference ==================================== Modern systems support the notion of "locales": a way to tell the system about the local character set and language. The current locale setting can affect the way regexp matching works, often in surprising ways. In particular, many locales do case-insensitive matching, even when you may have specified characters of only one particular case. The following example uses the `sub' function, which does text replacement (*note String Functions::). Here, the intent is to remove trailing uppercase characters: $ echo something1234abc | gawk '{ sub("[A-Z]*$", ""); print }' -| something1234 This output is unexpected, since the `abc' at the end of `something1234abc' should not normally match `[A-Z]*'. This result is due to the locale setting (and thus you may not see it on your system). There are two fixes. The first is to use the POSIX character class `[[:upper:]]', instead of `[A-Z]'. (This is preferred, since then your program will work everywhere.) The second is to change the locale setting in the environment, before running `gawk', by using the shell statements: LANG=C LC_ALL=C export LANG LC_ALL The setting `C' forces `gawk' to behave in the traditional Unix manner, where case distinctions do matter. You may wish to put these statements into your shell startup file, e.g., `$HOME/.profile'. Similar considerations apply to other ranges. For example, `["-/]' is perfectly valid in ASCII, but is not valid in many Unicode locales, such as `en_US.UTF-8'. (In general, such ranges should be avoided; either list the characters individually, or use a POSIX character class such as `[[:punct:]]'.) For the normal case of `RS = "\n"', the locale is largely irrelevant. For other single-character record separators, using `LC_ALL=C' will give you much better performance when reading records. Otherwise, `gawk' has to make several function calls, _per input character_ to find the record terminator. Finally, the locale affects the value of the decimal point character used when `gawk' parses input data. This is discussed in detail in *note Conversion::.  File: gawk.info, Node: Reading Files, Next: Printing, Prev: Regexp, Up: Top 3 Reading Input Files ********************* In the typical `awk' program, all input is read either from the standard input (by default, this is the keyboard, but often it is a pipe from another command) or from files whose names you specify on the `awk' command line. If you specify input files, `awk' reads them in order, processing all the data from one before going on to the next. The name of the current input file can be found in the built-in variable `FILENAME' (*note Built-in Variables::). The input is read in units called "records", and is processed by the rules of your program one record at a time. By default, each record is one line. Each record is automatically split into chunks called "fields". This makes it more convenient for programs to work on the parts of a record. On rare occasions, you may need to use the `getline' command. The `getline' command is valuable, both because it can do explicit input from any number of files, and because the files used with it do not have to be named on the `awk' command line (*note Getline::). * Menu: * Records:: Controlling how data is split into records. * Fields:: An introduction to fields. * Nonconstant Fields:: Nonconstant Field Numbers. * Changing Fields:: Changing the Contents of a Field. * Field Separators:: The field separator and how to change it. * Constant Size:: Reading constant width data. * Multiple Line:: Reading multi-line records. * Getline:: Reading files under explicit program control using the `getline' function.  File: gawk.info, Node: Records, Next: Fields, Up: Reading Files 3.1 How Input Is Split into Records =================================== The `awk' utility divides the input for your `awk' program into records and fields. `awk' keeps track of the number of records that have been read so far from the current input file. This value is stored in a built-in variable called `FNR'. It is reset to zero when a new file is started. Another built-in variable, `NR', is the total number of input records read so far from all data files. It starts at zero, but is never automatically reset to zero. Records are separated by a character called the "record separator". By default, the record separator is the newline character. This is why records are, by default, single lines. A different character can be used for the record separator by assigning the character to the built-in variable `RS'. Like any other variable, the value of `RS' can be changed in the `awk' program with the assignment operator, `=' (*note Assignment Ops::). The new record-separator character should be enclosed in quotation marks, which indicate a string constant. Often the right time to do this is at the beginning of execution, before any input is processed, so that the very first record is read with the proper separator. To do this, use the special `BEGIN' pattern (*note BEGIN/END::). For example: awk 'BEGIN { RS = "/" } { print $0 }' BBS-list changes the value of `RS' to `"/"', before reading any input. This is a string whose first character is a slash; as a result, records are separated by slashes. Then the input file is read, and the second rule in the `awk' program (the action with no pattern) prints each record. Because each `print' statement adds a newline at the end of its output, this `awk' program copies the input with each slash changed to a newline. Here are the results of running the program on `BBS-list': $ awk 'BEGIN { RS = "/" } > { print $0 }' BBS-list -| aardvark 555-5553 1200 -| 300 B -| alpo-net 555-3412 2400 -| 1200 -| 300 A -| barfly 555-7685 1200 -| 300 A -| bites 555-1675 2400 -| 1200 -| 300 A -| camelot 555-0542 300 C -| core 555-2912 1200 -| 300 C -| fooey 555-1234 2400 -| 1200 -| 300 B -| foot 555-6699 1200 -| 300 B -| macfoo 555-6480 1200 -| 300 A -| sdace 555-3430 2400 -| 1200 -| 300 A -| sabafoo 555-2127 1200 -| 300 C -| Note that the entry for the `camelot' BBS is not split. In the original data file (*note Sample Data Files::), the line looks like this: camelot 555-0542 300 C It has one baud rate only, so there are no slashes in the record, unlike the others which have two or more baud rates. In fact, this record is treated as part of the record for the `core' BBS; the newline separating them in the output is the original newline in the data file, not the one added by `awk' when it printed the record! Another way to change the record separator is on the command line, using the variable-assignment feature (*note Other Arguments::): awk '{ print $0 }' RS="/" BBS-list This sets `RS' to `/' before processing `BBS-list'. Using an unusual character such as `/' for the record separator produces correct behavior in the vast majority of cases. However, the following (extreme) pipeline prints a surprising `1': $ echo | awk 'BEGIN { RS = "a" } ; { print NF }' -| 1 There is one field, consisting of a newline. The value of the built-in variable `NF' is the number of fields in the current record. Reaching the end of an input file terminates the current input record, even if the last character in the file is not the character in `RS'. (d.c.) The empty string `""' (a string without any characters) has a special meaning as the value of `RS'. It means that records are separated by one or more blank lines and nothing else. *Note Multiple Line::, for more details. If you change the value of `RS' in the middle of an `awk' run, the new value is used to delimit subsequent records, but the record currently being processed, as well as records already processed, are not affected. After the end of the record has been determined, `gawk' sets the variable `RT' to the text in the input that matched `RS'. When using `gawk', the value of `RS' is not limited to a one-character string. It can be any regular expression (*note Regexp::). In general, each record ends at the next string that matches the regular expression; the next record starts at the end of the matching string. This general rule is actually at work in the usual case, where `RS' contains just a newline: a record ends at the beginning of the next matching string (the next newline in the input), and the following record starts just after the end of this string (at the first character of the following line). The newline, because it matches `RS', is not part of either record. When `RS' is a single character, `RT' contains the same single character. However, when `RS' is a regular expression, `RT' contains the actual input text that matched the regular expression. The following example illustrates both of these features. It sets `RS' equal to a regular expression that matches either a newline or a series of one or more uppercase letters with optional leading and/or trailing whitespace: $ echo record 1 AAAA record 2 BBBB record 3 | > gawk 'BEGIN { RS = "\n|( *[[:upper:]]+ *)" } > { print "Record =", $0, "and RT =", RT }' -| Record = record 1 and RT = AAAA -| Record = record 2 and RT = BBBB -| Record = record 3 and RT = -| The final line of output has an extra blank line. This is because the value of `RT' is a newline, and the `print' statement supplies its own terminating newline. *Note Simple Sed::, for a more useful example of `RS' as a regexp and `RT'. If you set `RS' to a regular expression that allows optional trailing text, such as `RS = "abc(XYZ)?"' it is possible, due to implementation constraints, that `gawk' may match the leading part of the regular expression, but not the trailing part, particularly if the input text that could match the trailing part is fairly long. `gawk' attempts to avoid this problem, but currently, there's no guarantee that this will never happen. NOTE: Remember that in `awk', the `^' and `$' anchor metacharacters match the beginning and end of a _string_, and not the beginning and end of a _line_. As a result, something like `RS = "^[[:upper:]]"' can only match at the beginning of a file. This is because `gawk' views the input file as one long string that happens to contain newline characters in it. It is thus best to avoid anchor characters in the value of `RS'. The use of `RS' as a regular expression and the `RT' variable are `gawk' extensions; they are not available in compatibility mode (*note Options::). In compatibility mode, only the first character of the value of `RS' is used to determine the end of the record. Advanced Notes: `RS = "\0"' Is Not Portable ------------------------------------------- There are times when you might want to treat an entire data file as a single record. The only way to make this happen is to give `RS' a value that you know doesn't occur in the input file. This is hard to do in a general way, such that a program always works for arbitrary input files. You might think that for text files, the NUL character, which consists of a character with all bits equal to zero, is a good value to use for `RS' in this case: BEGIN { RS = "\0" } # whole file becomes one record? `gawk' in fact accepts this, and uses the NUL character for the record separator. However, this usage is _not_ portable to other `awk' implementations. All other `awk' implementations(1) store strings internally as C-style strings. C strings use the NUL character as the string terminator. In effect, this means that `RS = "\0"' is the same as `RS = ""'. (d.c.) The best way to treat a whole file as a single record is to simply read the file in, one record at a time, concatenating each record onto the end of the previous ones. ---------- Footnotes ---------- (1) At least that we know about.  File: gawk.info, Node: Fields, Next: Nonconstant Fields, Prev: Records, Up: Reading Files 3.2 Examining Fields ==================== When `awk' reads an input record, the record is automatically "parsed" or separated by the interpreter into chunks called "fields". By default, fields are separated by "whitespace", like words in a line. Whitespace in `awk' means any string of one or more spaces, tabs, or newlines;(1) other characters, such as formfeed, vertical tab, etc. that are considered whitespace by other languages, are _not_ considered whitespace by `awk'. The purpose of fields is to make it more convenient for you to refer to these pieces of the record. You don't have to use them--you can operate on the whole record if you want--but fields are what make simple `awk' programs so powerful. A dollar-sign (`$') is used to refer to a field in an `awk' program, followed by the number of the field you want. Thus, `$1' refers to the first field, `$2' to the second, and so on. (Unlike the Unix shells, the field numbers are not limited to single digits. `$127' is the one hundred twenty-seventh field in the record.) For example, suppose the following is a line of input: This seems like a pretty nice example. Here the first field, or `$1', is `This', the second field, or `$2', is `seems', and so on. Note that the last field, `$7', is `example.'. Because there is no space between the `e' and the `.', the period is considered part of the seventh field. `NF' is a built-in variable whose value is the number of fields in the current record. `awk' automatically updates the value of `NF' each time it reads a record. No matter how many fields there are, the last field in a record can be represented by `$NF'. So, `$NF' is the same as `$7', which is `example.'. If you try to reference a field beyond the last one (such as `$8' when the record has only seven fields), you get the empty string. (If used in a numeric operation, you get zero.) The use of `$0', which looks like a reference to the "zero-th" field, is a special case: it represents the whole input record when you are not interested in specific fields. Here are some more examples: $ awk '$1 ~ /foo/ { print $0 }' BBS-list -| fooey 555-1234 2400/1200/300 B -| foot 555-6699 1200/300 B -| macfoo 555-6480 1200/300 A -| sabafoo 555-2127 1200/300 C This example prints each record in the file `BBS-list' whose first field contains the string `foo'. The operator `~' is called a "matching operator" (*note Regexp Usage::); it tests whether a string (here, the field `$1') matches a given regular expression. By contrast, the following example looks for `foo' in _the entire record_ and prints the first field and the last field for each matching input record: $ awk '/foo/ { print $1, $NF }' BBS-list -| fooey B -| foot B -| macfoo A -| sabafoo C ---------- Footnotes ---------- (1) In POSIX `awk', newlines are not considered whitespace for separating fields.  File: gawk.info, Node: Nonconstant Fields, Next: Changing Fields, Prev: Fields, Up: Reading Files 3.3 Nonconstant Field Numbers ============================= The number of a field does not need to be a constant. Any expression in the `awk' language can be used after a `$' to refer to a field. The value of the expression specifies the field number. If the value is a string, rather than a number, it is converted to a number. Consider this example: awk '{ print $NR }' Recall that `NR' is the number of records read so far: one in the first record, two in the second, etc. So this example prints the first field of the first record, the second field of the second record, and so on. For the twentieth record, field number 20 is printed; most likely, the record has fewer than 20 fields, so this prints a blank line. Here is another example of using expressions as field numbers: awk '{ print $(2*2) }' BBS-list `awk' evaluates the expression `(2*2)' and uses its value as the number of the field to print. The `*' sign represents multiplication, so the expression `2*2' evaluates to four. The parentheses are used so that the multiplication is done before the `$' operation; they are necessary whenever there is a binary operator in the field-number expression. This example, then, prints the hours of operation (the fourth field) for every line of the file `BBS-list'. (All of the `awk' operators are listed, in order of decreasing precedence, in *note Precedence::.) If the field number you compute is zero, you get the entire record. Thus, `$(2-2)' has the same value as `$0'. Negative field numbers are not allowed; trying to reference one usually terminates the program. (The POSIX standard does not define what happens when you reference a negative field number. `gawk' notices this and terminates your program. Other `awk' implementations may behave differently.) As mentioned in *note Fields::, `awk' stores the current record's number of fields in the built-in variable `NF' (also *note Built-in Variables::). The expression `$NF' is not a special feature--it is the direct consequence of evaluating `NF' and using its value as a field number.  File: gawk.info, Node: Changing Fields, Next: Field Separators, Prev: Nonconstant Fields, Up: Reading Files 3.4 Changing the Contents of a Field ==================================== The contents of a field, as seen by `awk', can be changed within an `awk' program; this changes what `awk' perceives as the current input record. (The actual input is untouched; `awk' _never_ modifies the input file.) Consider the following example and its output: $ awk '{ nboxes = $3 ; $3 = $3 - 10 > print nboxes, $3 }' inventory-shipped -| 25 15 -| 32 22 -| 24 14 ... The program first saves the original value of field three in the variable `nboxes'. The `-' sign represents subtraction, so this program reassigns field three, `$3', as the original value of field three minus ten: `$3 - 10'. (*Note Arithmetic Ops::.) Then it prints the original and new values for field three. (Someone in the warehouse made a consistent mistake while inventorying the red boxes.) For this to work, the text in field `$3' must make sense as a number; the string of characters must be converted to a number for the computer to do arithmetic on it. The number resulting from the subtraction is converted back to a string of characters that then becomes field three. *Note Conversion::. When the value of a field is changed (as perceived by `awk'), the text of the input record is recalculated to contain the new field where the old one was. In other words, `$0' changes to reflect the altered field. Thus, this program prints a copy of the input file, with 10 subtracted from the second field of each line: $ awk '{ $2 = $2 - 10; print $0 }' inventory-shipped -| Jan 3 25 15 115 -| Feb 5 32 24 226 -| Mar 5 24 34 228 ... It is also possible to also assign contents to fields that are out of range. For example: $ awk '{ $6 = ($5 + $4 + $3 + $2) > print $6 }' inventory-shipped -| 168 -| 297 -| 301 ... We've just created `$6', whose value is the sum of fields `$2', `$3', `$4', and `$5'. The `+' sign represents addition. For the file `inventory-shipped', `$6' represents the total number of parcels shipped for a particular month. Creating a new field changes `awk''s internal copy of the current input record, which is the value of `$0'. Thus, if you do `print $0' after adding a field, the record printed includes the new field, with the appropriate number of field separators between it and the previously existing fields. This recomputation affects and is affected by `NF' (the number of fields; *note Fields::). For example, the value of `NF' is set to the number of the highest field you create. The exact format of `$0' is also affected by a feature that has not been discussed yet: the "output field separator", `OFS', used to separate the fields (*note Output Separators::). Note, however, that merely _referencing_ an out-of-range field does _not_ change the value of either `$0' or `NF'. Referencing an out-of-range field only produces an empty string. For example: if ($(NF+1) != "") print "can't happen" else print "everything is normal" should print `everything is normal', because `NF+1' is certain to be out of range. (*Note If Statement::, for more information about `awk''s `if-else' statements. *Note Typing and Comparison::, for more information about the `!=' operator.) It is important to note that making an assignment to an existing field changes the value of `$0' but does not change the value of `NF', even when you assign the empty string to a field. For example: $ echo a b c d | awk '{ OFS = ":"; $2 = "" > print $0; print NF }' -| a::c:d -| 4 The field is still there; it just has an empty value, denoted by the two colons between `a' and `c'. This example shows what happens if you create a new field: $ echo a b c d | awk '{ OFS = ":"; $2 = ""; $6 = "new" > print $0; print NF }' -| a::c:d::new -| 6 The intervening field, `$5', is created with an empty value (indicated by the second pair of adjacent colons), and `NF' is updated with the value six. Decrementing `NF' throws away the values of the fields after the new value of `NF' and recomputes `$0'. (d.c.) Here is an example: $ echo a b c d e f | awk '{ print "NF =", NF; > NF = 3; print $0 }' -| NF = 6 -| a b c *Caution:* Some versions of `awk' don't rebuild `$0' when `NF' is decremented. Caveat emptor. Finally, there are times when it is convenient to force `awk' to rebuild the entire record, using the current value of the fields and `OFS'. To do this, use the seemingly innocuous assignment: $1 = $1 # force record to be reconstituted print $0 # or whatever else with $0 This forces `awk' rebuild the record. It does help to add a comment, as we've shown here. There is a flip side to the relationship between `$0' and the fields. Any assignment to `$0' causes the record to be reparsed into fields using the _current_ value of `FS'. This also applies to any built-in function that updates `$0', such as `sub' and `gsub' (*note String Functions::).  File: gawk.info, Node: Field Separators, Next: Constant Size, Prev: Changing Fields, Up: Reading Files 3.5 Specifying How Fields Are Separated ======================================= * Menu: * Regexp Field Splitting:: Using regexps as the field separator. * Single Character Fields:: Making each character a separate field. * Command Line Field Separator:: Setting `FS' from the command-line. * Field Splitting Summary:: Some final points and a summary table. The "field separator", which is either a single character or a regular expression, controls the way `awk' splits an input record into fields. `awk' scans the input record for character sequences that match the separator; the fields themselves are the text between the matches. In the examples that follow, we use the bullet symbol (*) to represent spaces in the output. If the field separator is `oo', then the following line: moo goo gai pan is split into three fields: `m', `*g', and `*gai*pan'. Note the leading spaces in the values of the second and third fields. The field separator is represented by the built-in variable `FS'. Shell programmers take note: `awk' does _not_ use the name `IFS' that is used by the POSIX-compliant shells (such as the Unix Bourne shell, `sh', or `bash'). The value of `FS' can be changed in the `awk' program with the assignment operator, `=' (*note Assignment Ops::). Often the right time to do this is at the beginning of execution before any input has been processed, so that the very first record is read with the proper separator. To do this, use the special `BEGIN' pattern (*note BEGIN/END::). For example, here we set the value of `FS' to the string `","': awk 'BEGIN { FS = "," } ; { print $2 }' Given the input line: John Q. Smith, 29 Oak St., Walamazoo, MI 42139 this `awk' program extracts and prints the string `*29*Oak*St.'. Sometimes the input data contains separator characters that don't separate fields the way you thought they would. For instance, the person's name in the example we just used might have a title or suffix attached, such as: John Q. Smith, LXIX, 29 Oak St., Walamazoo, MI 42139 The same program would extract `*LXIX', instead of `*29*Oak*St.'. If you were expecting the program to print the address, you would be surprised. The moral is to choose your data layout and separator characters carefully to prevent such problems. (If the data is not in a form that is easy to process, perhaps you can massage it first with a separate `awk' program.) Fields are normally separated by whitespace sequences (spaces, tabs, and newlines), not by single spaces. Two spaces in a row do not delimit an empty field. The default value of the field separator `FS' is a string containing a single space, `" "'. If `awk' interpreted this value in the usual way, each space character would separate fields, so two spaces in a row would make an empty field between them. The reason this does not happen is that a single space as the value of `FS' is a special case--it is taken to specify the default manner of delimiting fields. If `FS' is any other single character, such as `","', then each occurrence of that character separates two fields. Two consecutive occurrences delimit an empty field. If the character occurs at the beginning or the end of the line, that too delimits an empty field. The space character is the only single character that does not follow these rules.  File: gawk.info, Node: Regexp Field Splitting, Next: Single Character Fields, Up: Field Separators 3.5.1 Using Regular Expressions to Separate Fields -------------------------------------------------- The previous node discussed the use of single characters or simple strings as the value of `FS'. More generally, the value of `FS' may be a string containing any regular expression. In this case, each match in the record for the regular expression separates fields. For example, the assignment: FS = ", \t" makes every area of an input line that consists of a comma followed by a space and a TAB into a field separator. (`\t' is an "escape sequence" that stands for a TAB; *note Escape Sequences::, for the complete list of similar escape sequences.) For a less trivial example of a regular expression, try using single spaces to separate fields the way single commas are used. `FS' can be set to `"[ ]"' (left bracket, space, right bracket). This regular expression matches a single space and nothing else (*note Regexp::). There is an important difference between the two cases of `FS = " "' (a single space) and `FS = "[ \t\n]+"' (a regular expression matching one or more spaces, tabs, or newlines). For both values of `FS', fields are separated by "runs" (multiple adjacent occurrences) of spaces, tabs, and/or newlines. However, when the value of `FS' is `" "', `awk' first strips leading and trailing whitespace from the record and then decides where the fields are. For example, the following pipeline prints `b': $ echo ' a b c d ' | awk '{ print $2 }' -| b However, this pipeline prints `a' (note the extra spaces around each letter): $ echo ' a b c d ' | awk 'BEGIN { FS = "[ \t\n]+" } > { print $2 }' -| a In this case, the first field is "null" or empty. The stripping of leading and trailing whitespace also comes into play whenever `$0' is recomputed. For instance, study this pipeline: $ echo ' a b c d' | awk '{ print; $2 = $2; print }' -| a b c d -| a b c d The first `print' statement prints the record as it was read, with leading whitespace intact. The assignment to `$2' rebuilds `$0' by concatenating `$1' through `$NF' together, separated by the value of `OFS'. Because the leading whitespace was ignored when finding `$1', it is not part of the new `$0'. Finally, the last `print' statement prints the new `$0'.  File: gawk.info, Node: Single Character Fields, Next: Command Line Field Separator, Prev: Regexp Field Splitting, Up: Field Separators 3.5.2 Making Each Character a Separate Field -------------------------------------------- There are times when you may want to examine each character of a record separately. This can be done in `gawk' by simply assigning the null string (`""') to `FS'. In this case, each individual character in the record becomes a separate field. For example: $ echo a b | gawk 'BEGIN { FS = "" } > { > for (i = 1; i <= NF; i = i + 1) > print "Field", i, "is", $i > }' -| Field 1 is a -| Field 2 is -| Field 3 is b Traditionally, the behavior of `FS' equal to `""' was not defined. In this case, most versions of Unix `awk' simply treat the entire record as only having one field. (d.c.) In compatibility mode (*note Options::), if `FS' is the null string, then `gawk' also behaves this way.  File: gawk.info, Node: Command Line Field Separator, Next: Field Splitting Summary, Prev: Single Character Fields, Up: Field Separators 3.5.3 Setting `FS' from the Command Line ---------------------------------------- `FS' can be set on the command line. Use the `-F' option to do so. For example: awk -F, 'PROGRAM' INPUT-FILES sets `FS' to the `,' character. Notice that the option uses an uppercase `F' instead of a lowercase `f'. The latter option (`-f') specifies a file containing an `awk' program. Case is significant in command-line options: the `-F' and `-f' options have nothing to do with each other. You can use both options at the same time to set the `FS' variable _and_ get an `awk' program from a file. The value used for the argument to `-F' is processed in exactly the same way as assignments to the built-in variable `FS'. Any special characters in the field separator must be escaped appropriately. For example, to use a `\' as the field separator on the command line, you would have to type: # same as FS = "\\" awk -F\\\\ '...' files ... Because `\' is used for quoting in the shell, `awk' sees `-F\\'. Then `awk' processes the `\\' for escape characters (*note Escape Sequences::), finally yielding a single `\' to use for the field separator. As a special case, in compatibility mode (*note Options::), if the argument to `-F' is `t', then `FS' is set to the TAB character. If you type `-F\t' at the shell, without any quotes, the `\' gets deleted, so `awk' figures that you really want your fields to be separated with tabs and not `t's. Use `-v FS="t"' or `-F"[t]"' on the command line if you really do want to separate your fields with `t's. For example, let's use an `awk' program file called `baud.awk' that contains the pattern `/300/' and the action `print $1': /300/ { print $1 } Let's also set `FS' to be the `-' character and run the program on the file `BBS-list'. The following command prints a list of the names of the bulletin boards that operate at 300 baud and the first three digits of their phone numbers: $ awk -F- -f baud.awk BBS-list -| aardvark 555 -| alpo -| barfly 555 -| bites 555 -| camelot 555 -| core 555 -| fooey 555 -| foot 555 -| macfoo 555 -| sdace 555 -| sabafoo 555 Note the second line of output. The second line in the original file looked like this: alpo-net 555-3412 2400/1200/300 A The `-' as part of the system's name was used as the field separator, instead of the `-' in the phone number that was originally intended. This demonstrates why you have to be careful in choosing your field and record separators. Perhaps the most common use of a single character as the field separator occurs when processing the Unix system password file. On many Unix systems, each user has a separate entry in the system password file, one line per user. The information in these lines is separated by colons. The first field is the user's login name and the second is the user's (encrypted or shadow) password. A password file entry might look like this: arnold:xyzzy:2076:10:Arnold Robbins:/home/arnold:/bin/bash The following program searches the system password file and prints the entries for users who have no password: awk -F: '$2 == ""' /etc/passwd  File: gawk.info, Node: Field Splitting Summary, Prev: Command Line Field Separator, Up: Field Separators 3.5.4 Field-Splitting Summary ----------------------------- It is important to remember that when you assign a string constant as the value of `FS', it undergoes normal `awk' string processing. For example, with Unix `awk' and `gawk', the assignment `FS = "\.."' assigns the character string `".."' to `FS' (the backslash is stripped). This creates a regexp meaning "fields are separated by occurrences of any two characters." If instead you want fields to be separated by a literal period followed by any single character, use `FS = "\\.."'. The following table summarizes how fields are split, based on the value of `FS' (`==' means "is equal to"): `FS == " "' Fields are separated by runs of whitespace. Leading and trailing whitespace are ignored. This is the default. `FS == ANY OTHER SINGLE CHARACTER' Fields are separated by each occurrence of the character. Multiple successive occurrences delimit empty fields, as do leading and trailing occurrences. The character can even be a regexp metacharacter; it does not need to be escaped. `FS == REGEXP' Fields are separated by occurrences of characters that match REGEXP. Leading and trailing matches of REGEXP delimit empty fields. `FS == ""' Each individual character in the record becomes a separate field. (This is a `gawk' extension; it is not specified by the POSIX standard.) Advanced Notes: Changing `FS' Does Not Affect the Fields -------------------------------------------------------- According to the POSIX standard, `awk' is supposed to behave as if each record is split into fields at the time it is read. In particular, this means that if you change the value of `FS' after a record is read, the value of the fields (i.e., how they were split) should reflect the old value of `FS', not the new one. However, many implementations of `awk' do not work this way. Instead, they defer splitting the fields until a field is actually referenced. The fields are split using the _current_ value of `FS'! (d.c.) This behavior can be difficult to diagnose. The following example illustrates the difference between the two methods. (The `sed'(1) command prints just the first line of `/etc/passwd'.) sed 1q /etc/passwd | awk '{ FS = ":" ; print $1 }' which usually prints: root on an incorrect implementation of `awk', while `gawk' prints something like: root:nSijPlPhZZwgE:0:0:Root:/: Advanced Notes: `FS' and `IGNORECASE' ------------------------------------- The `IGNORECASE' variable (*note User-modified::) affects field splitting _only_ when the value of `FS' is a regexp. It has no effect when `FS' is a single character, even if that character is a letter. Thus, in the following code: FS = "c" IGNORECASE = 1 $0 = "aCa" print $1 The output is `aCa'. If you really want to split fields on an alphabetic character while ignoring case, use a regexp that will do it for you. E.g., `FS = "[c]"'. In this case, `IGNORECASE' will take effect. ---------- Footnotes ---------- (1) The `sed' utility is a "stream editor." Its behavior is also defined by the POSIX standard.  File: gawk.info, Node: Constant Size, Next: Multiple Line, Prev: Field Separators, Up: Reading Files 3.6 Reading Fixed-Width Data ============================ (This minor node discusses an advanced feature of `awk'. If you are a novice `awk' user, you might want to skip it on the first reading.) `gawk' version 2.13 introduced a facility for dealing with fixed-width fields with no distinctive field separator. For example, data of this nature arises in the input for old Fortran programs where numbers are run together, or in the output of programs that did not anticipate the use of their output as input for other programs. An example of the latter is a table where all the columns are lined up by the use of a variable number of spaces and _empty fields are just spaces_. Clearly, `awk''s normal field splitting based on `FS' does not work well in this case. Although a portable `awk' program can use a series of `substr' calls on `$0' (*note String Functions::), this is awkward and inefficient for a large number of fields. The splitting of an input record into fixed-width fields is specified by assigning a string containing space-separated numbers to the built-in variable `FIELDWIDTHS'. Each number specifies the width of the field, _including_ columns between fields. If you want to ignore the columns between fields, you can specify the width as a separate field that is subsequently ignored. It is a fatal error to supply a field width that is not a positive number. The following data is the output of the Unix `w' utility. It is useful to illustrate the use of `FIELDWIDTHS': 10:06pm up 21 days, 14:04, 23 users User tty login idle JCPU PCPU what hzuo ttyV0 8:58pm 9 5 vi p24.tex hzang ttyV3 6:37pm 50 -csh eklye ttyV5 9:53pm 7 1 em thes.tex dportein ttyV6 8:17pm 1:47 -csh gierd ttyD3 10:00pm 1 elm dave ttyD4 9:47pm 4 4 w brent ttyp0 26Jun91 4:46 26:46 4:41 bash dave ttyq4 26Jun9115days 46 46 wnewmail The following program takes the above input, converts the idle time to number of seconds, and prints out the first two fields and the calculated idle time: NOTE: This program uses a number of `awk' features that haven't been introduced yet. BEGIN { FIELDWIDTHS = "9 6 10 6 7 7 35" } NR > 2 { idle = $4 sub(/^ */, "", idle) # strip leading spaces if (idle == "") idle = 0 if (idle ~ /:/) { split(idle, t, ":") idle = t[1] * 60 + t[2] } if (idle ~ /days/) idle *= 24 * 60 * 60 print $1, $2, idle } Running the program on the data produces the following results: hzuo ttyV0 0 hzang ttyV3 50 eklye ttyV5 0 dportein ttyV6 107 gierd ttyD3 1 dave ttyD4 0 brent ttyp0 286 dave ttyq4 1296000 Another (possibly more practical) example of fixed-width input data is the input from a deck of balloting cards. In some parts of the United States, voters mark their choices by punching holes in computer cards. These cards are then processed to count the votes for any particular candidate or on any particular issue. Because a voter may choose not to vote on some issue, any column on the card may be empty. An `awk' program for processing such data could use the `FIELDWIDTHS' feature to simplify reading the data. (Of course, getting `gawk' to run on a system with card readers is another story!) Assigning a value to `FS' causes `gawk' to use `FS' for field splitting again. Use `FS = FS' to make this happen, without having to know the current value of `FS'. In order to tell which kind of field splitting is in effect, use `PROCINFO["FS"]' (*note Auto-set::). The value is `"FS"' if regular field splitting is being used, or it is `"FIELDWIDTHS"' if fixed-width field splitting is being used: if (PROCINFO["FS"] == "FS") REGULAR FIELD SPLITTING ... else FIXED-WIDTH FIELD SPLITTING ... This information is useful when writing a function that needs to temporarily change `FS' or `FIELDWIDTHS', read some records, and then restore the original settings (*note Passwd Functions::, for an example of such a function).  File: gawk.info, Node: Multiple Line, Next: Getline, Prev: Constant Size, Up: Reading Files 3.7 Multiple-Line Records ========================= In some databases, a single line cannot conveniently hold all the information in one entry. In such cases, you can use multiline records. The first step in doing this is to choose your data format. One technique is to use an unusual character or string to separate records. For example, you could use the formfeed character (written `\f' in `awk', as in C) to separate them, making each record a page of the file. To do this, just set the variable `RS' to `"\f"' (a string containing the formfeed character). Any other character could equally well be used, as long as it won't be part of the data in a record. Another technique is to have blank lines separate records. By a special dispensation, an empty string as the value of `RS' indicates that records are separated by one or more blank lines. When `RS' is set to the empty string, each record always ends at the first blank line encountered. The next record doesn't start until the first nonblank line that follows. No matter how many blank lines appear in a row, they all act as one record separator. (Blank lines must be completely empty; lines that contain only whitespace do not count.) You can achieve the same effect as `RS = ""' by assigning the string `"\n\n+"' to `RS'. This regexp matches the newline at the end of the record and one or more blank lines after the record. In addition, a regular expression always matches the longest possible sequence when there is a choice (*note Leftmost Longest::). So the next record doesn't start until the first nonblank line that follows--no matter how many blank lines appear in a row, they are considered one record separator. There is an important difference between `RS = ""' and `RS = "\n\n+"'. In the first case, leading newlines in the input data file are ignored, and if a file ends without extra blank lines after the last record, the final newline is removed from the record. In the second case, this special processing is not done. (d.c.) Now that the input is separated into records, the second step is to separate the fields in the record. One way to do this is to divide each of the lines into fields in the normal manner. This happens by default as the result of a special feature. When `RS' is set to the empty string, _and_ `FS' is set to a single character, the newline character _always_ acts as a field separator. This is in addition to whatever field separations result from `FS'.(1) The original motivation for this special exception was probably to provide useful behavior in the default case (i.e., `FS' is equal to `" "'). This feature can be a problem if you really don't want the newline character to separate fields, because there is no way to prevent it. However, you can work around this by using the `split' function to break up the record manually (*note String Functions::). If you have a single character field separator, you can work around the special feature in a different way, by making `FS' into a regexp for that single character. For example, if the field separator is a percent character, instead of `FS = "%"', use `FS = "[%]"'. Another way to separate fields is to put each field on a separate line: to do this, just set the variable `FS' to the string `"\n"'. (This single character separator matches a single newline.) A practical example of a data file organized this way might be a mailing list, where each entry is separated by blank lines. Consider a mailing list in a file named `addresses', which looks like this: Jane Doe 123 Main Street Anywhere, SE 12345-6789 John Smith 456 Tree-lined Avenue Smallville, MW 98765-4321 ... A simple program to process this file is as follows: # addrs.awk --- simple mailing list program # Records are separated by blank lines. # Each line is one field. BEGIN { RS = "" ; FS = "\n" } { print "Name is:", $1 print "Address is:", $2 print "City and State are:", $3 print "" } Running the program produces the following output: $ awk -f addrs.awk addresses -| Name is: Jane Doe -| Address is: 123 Main Street -| City and State are: Anywhere, SE 12345-6789 -| -| Name is: John Smith -| Address is: 456 Tree-lined Avenue -| City and State are: Smallville, MW 98765-4321 -| ... *Note Labels Program::, for a more realistic program that deals with address lists. The following table summarizes how records are split, based on the value of `RS'. (`==' means "is equal to.") `RS == "\n"' Records are separated by the newline character (`\n'). In effect, every line in the data file is a separate record, including blank lines. This is the default. `RS == ANY SINGLE CHARACTER' Records are separated by each occurrence of the character. Multiple successive occurrences delimit empty records. `RS == ""' Records are separated by runs of blank lines. When `FS' is a single character, then the newline character always serves as a field separator, in addition to whatever value `FS' may have. Leading and trailing newlines in a file are ignored. `RS == REGEXP' Records are separated by occurrences of characters that match REGEXP. Leading and trailing matches of REGEXP delimit empty records. (This is a `gawk' extension; it is not specified by the POSIX standard.) In all cases, `gawk' sets `RT' to the input text that matched the value specified by `RS'. ---------- Footnotes ---------- (1) When `FS' is the null string (`""') or a regexp, this special feature of `RS' does not apply. It does apply to the default field separator of a single space: `FS = " "'.  File: gawk.info, Node: Getline, Prev: Multiple Line, Up: Reading Files 3.8 Explicit Input with `getline' ================================= So far we have been getting our input data from `awk''s main input stream--either the standard input (usually your terminal, sometimes the output from another program) or from the files specified on the command line. The `awk' language has a special built-in command called `getline' that can be used to read input under your explicit control. The `getline' command is used in several different ways and should _not_ be used by beginners. The examples that follow the explanation of the `getline' command include material that has not been covered yet. Therefore, come back and study the `getline' command _after_ you have reviewed the rest of this Info file and have a good knowledge of how `awk' works. The `getline' command returns one if it finds a record and zero if it encounters the end of the file. If there is some error in getting a record, such as a file that cannot be opened, then `getline' returns -1. In this case, `gawk' sets the variable `ERRNO' to a string describing the error that occurred. In the following examples, COMMAND stands for a string value that represents a shell command. * Menu: * Plain Getline:: Using `getline' with no arguments. * Getline/Variable:: Using `getline' into a variable. * Getline/File:: Using `getline' from a file. * Getline/Variable/File:: Using `getline' into a variable from a file. * Getline/Pipe:: Using `getline' from a pipe. * Getline/Variable/Pipe:: Using `getline' into a variable from a pipe. * Getline/Coprocess:: Using `getline' from a coprocess. * Getline/Variable/Coprocess:: Using `getline' into a variable from a coprocess. * Getline Notes:: Important things to know about `getline'. * Getline Summary:: Summary of `getline' Variants.  File: gawk.info, Node: Plain Getline, Next: Getline/Variable, Up: Getline 3.8.1 Using `getline' with No Arguments --------------------------------------- The `getline' command can be used without arguments to read input from the current input file. All it does in this case is read the next input record and split it up into fields. This is useful if you've finished processing the current record, but want to do some special processing on the next record _right now_. For example: { if ((t = index($0, "/*")) != 0) { # value of `tmp' will be "" if t is 1 tmp = substr($0, 1, t - 1) u = index(substr($0, t + 2), "*/") while (u == 0) { if (getline <= 0) { m = "unexpected EOF or error" m = (m ": " ERRNO) print m > "/dev/stderr" exit } u = index($0, "*/") } # substr expression will be "" if */ # occurred at end of line $0 = tmp substr($0, u + 2) } print $0 } This `awk' program deletes C-style comments (`/* ... */') from the input. By replacing the `print $0' with other statements, you could perform more complicated processing on the decommented input, such as searching for matches of a regular expression. (This program has a subtle problem--it does not work if one comment ends and another begins on the same line.) This form of the `getline' command sets `NF', `NR', `FNR', and the value of `$0'. NOTE: The new value of `$0' is used to test the patterns of any subsequent rules. The original value of `$0' that triggered the rule that executed `getline' is lost. By contrast, the `next' statement reads a new record but immediately begins processing it normally, starting with the first rule in the program. *Note Next Statement::.  File: gawk.info, Node: Getline/Variable, Next: Getline/File, Prev: Plain Getline, Up: Getline 3.8.2 Using `getline' into a Variable ------------------------------------- You can use `getline VAR' to read the next record from `awk''s input into the variable VAR. No other processing is done. For example, suppose the next line is a comment or a special string, and you want to read it without triggering any rules. This form of `getline' allows you to read that line and store it in a variable so that the main read-a-line-and-check-each-rule loop of `awk' never sees it. The following example swaps every two lines of input: { if ((getline tmp) > 0) { print tmp print $0 } else print $0 } It takes the following list: wan tew free phore and produces these results: tew wan phore free The `getline' command used in this way sets only the variables `NR' and `FNR' (and of course, VAR). The record is not split into fields, so the values of the fields (including `$0') and the value of `NF' do not change.  File: gawk.info, Node: Getline/File, Next: Getline/Variable/File, Prev: Getline/Variable, Up: Getline 3.8.3 Using `getline' from a File --------------------------------- Use `getline < FILE' to read the next record from FILE. Here FILE is a string-valued expression that specifies the file name. `< FILE' is called a "redirection" because it directs input to come from a different place. For example, the following program reads its input record from the file `secondary.input' when it encounters a first field with a value equal to 10 in the current input file: { if ($1 == 10) { getline < "secondary.input" print } else print } Because the main input stream is not used, the values of `NR' and `FNR' are not changed. However, the record it reads is split into fields in the normal manner, so the values of `$0' and the other fields are changed, resulting in a new value of `NF'. According to POSIX, `getline < EXPRESSION' is ambiguous if EXPRESSION contains unparenthesized operators other than `$'; for example, `getline < dir "/" file' is ambiguous because the concatenation operator is not parenthesized. You should write it as `getline < (dir "/" file)' if you want your program to be portable to other `awk' implementations.  File: gawk.info, Node: Getline/Variable/File, Next: Getline/Pipe, Prev: Getline/File, Up: Getline 3.8.4 Using `getline' into a Variable from a File ------------------------------------------------- Use `getline VAR < FILE' to read input from the file FILE, and put it in the variable VAR. As above, FILE is a string-valued expression that specifies the file from which to read. In this version of `getline', none of the built-in variables are changed and the record is not split into fields. The only variable changed is VAR. For example, the following program copies all the input files to the output, except for records that say `@include FILENAME'. Such a record is replaced by the contents of the file FILENAME: { if (NF == 2 && $1 == "@include") { while ((getline line < $2) > 0) print line close($2) } else print } Note here how the name of the extra input file is not built into the program; it is taken directly from the data, specifically from the second field on the `@include' line. The `close' function is called to ensure that if two identical `@include' lines appear in the input, the entire specified file is included twice. *Note Close Files And Pipes::. One deficiency of this program is that it does not process nested `@include' statements (i.e., `@include' statements in included files) the way a true macro preprocessor would. *Note Igawk Program::, for a program that does handle nested `@include' statements.  File: gawk.info, Node: Getline/Pipe, Next: Getline/Variable/Pipe, Prev: Getline/Variable/File, Up: Getline 3.8.5 Using `getline' from a Pipe --------------------------------- The output of a command can also be piped into `getline', using `COMMAND | getline'. In this case, the string COMMAND is run as a shell command and its output is piped into `awk' to be used as input. This form of `getline' reads one record at a time from the pipe. For example, the following program copies its input to its output, except for lines that begin with `@execute', which are replaced by the output produced by running the rest of the line as a shell command: { if ($1 == "@execute") { tmp = substr($0, 10) while ((tmp | getline) > 0) print close(tmp) } else print } The `close' function is called to ensure that if two identical `@execute' lines appear in the input, the command is run for each one. *Note Close Files And Pipes::. Given the input: foo bar baz @execute who bletch the program might produce: foo bar baz arnold ttyv0 Jul 13 14:22 miriam ttyp0 Jul 13 14:23 (murphy:0) bill ttyp1 Jul 13 14:23 (murphy:0) bletch Notice that this program ran the command `who' and printed the previous result. (If you try this program yourself, you will of course get different results, depending upon who is logged in on your system.) This variation of `getline' splits the record into fields, sets the value of `NF', and recomputes the value of `$0'. The values of `NR' and `FNR' are not changed. According to POSIX, `EXPRESSION | getline' is ambiguous if EXPRESSION contains unparenthesized operators other than `$'--for example, `"echo " "date" | getline' is ambiguous because the concatenation operator is not parenthesized. You should write it as `("echo " "date") | getline' if you want your program to be portable to other `awk' implementations. NOTE: Unfortunately, `gawk' has not been consistent in its treatment of a construct like `"echo " "date" | getline'. Up to and including version 3.1.1 of `gawk', it was treated as `("echo " "date") | getline'. (This how Unix `awk' behaves.) From 3.1.2 through 3.1.5, it was treated as `"echo " ("date" | getline)'. (This is how `mawk' behaves.) Starting with version 3.1.6, the earlier behavior was reinstated. In short, _always_ use explicit parentheses, and then you won't have to worry.  File: gawk.info, Node: Getline/Variable/Pipe, Next: Getline/Coprocess, Prev: Getline/Pipe, Up: Getline 3.8.6 Using `getline' into a Variable from a Pipe ------------------------------------------------- When you use `COMMAND | getline VAR', the output of COMMAND is sent through a pipe to `getline' and into the variable VAR. For example, the following program reads the current date and time into the variable `current_time', using the `date' utility, and then prints it: BEGIN { "date" | getline current_time close("date") print "Report printed on " current_time } In this version of `getline', none of the built-in variables are changed and the record is not split into fields. According to POSIX, `EXPRESSION | getline VAR' is ambiguous if EXPRESSION contains unparenthesized operators other than `$'; for example, `"echo " "date" | getline VAR' is ambiguous because the concatenation operator is not parenthesized. You should write it as `("echo " "date") | getline VAR' if you want your program to be portable to other `awk' implementations.  File: gawk.info, Node: Getline/Coprocess, Next: Getline/Variable/Coprocess, Prev: Getline/Variable/Pipe, Up: Getline 3.8.7 Using `getline' from a Coprocess -------------------------------------- Input into `getline' from a pipe is a one-way operation. The command that is started with `COMMAND | getline' only sends data _to_ your `awk' program. On occasion, you might want to send data to another program for processing and then read the results back. `gawk' allows you to start a "coprocess", with which two-way communications are possible. This is done with the `|&' operator. Typically, you write data to the coprocess first and then read results back, as shown in the following: print "SOME QUERY" |& "db_server" "db_server" |& getline which sends a query to `db_server' and then reads the results. The values of `NR' and `FNR' are not changed, because the main input stream is not used. However, the record is split into fields in the normal manner, thus changing the values of `$0', of the other fields, and of `NF'. Coprocesses are an advanced feature. They are discussed here only because this is the minor node on `getline'. *Note Two-way I/O::, where coprocesses are discussed in more detail.  File: gawk.info, Node: Getline/Variable/Coprocess, Next: Getline Notes, Prev: Getline/Coprocess, Up: Getline 3.8.8 Using `getline' into a Variable from a Coprocess ------------------------------------------------------ When you use `COMMAND |& getline VAR', the output from the coprocess COMMAND is sent through a two-way pipe to `getline' and into the variable VAR. In this version of `getline', none of the built-in variables are changed and the record is not split into fields. The only variable changed is VAR. Coprocesses are an advanced feature. They are discussed here only because this is the minor node on `getline'. *Note Two-way I/O::, where coprocesses are discussed in more detail.  File: gawk.info, Node: Getline Notes, Next: Getline Summary, Prev: Getline/Variable/Coprocess, Up: Getline 3.8.9 Points to Remember About `getline' ---------------------------------------- Here are some miscellaneous points about `getline' that you should bear in mind: * When `getline' changes the value of `$0' and `NF', `awk' does _not_ automatically jump to the start of the program and start testing the new record against every pattern. However, the new record is tested against any subsequent rules. * Many `awk' implementations limit the number of pipelines that an `awk' program may have open to just one. In `gawk', there is no such limit. You can open as many pipelines (and coprocesses) as the underlying operating system permits. * An interesting side effect occurs if you use `getline' without a redirection inside a `BEGIN' rule. Because an unredirected `getline' reads from the command-line data files, the first `getline' command causes `awk' to set the value of `FILENAME'. Normally, `FILENAME' does not have a value inside `BEGIN' rules, because you have not yet started to process the command-line data files. (d.c.) (*Note BEGIN/END::, also *note Auto-set::.) * Using `FILENAME' with `getline' (`getline < FILENAME') is likely to be a source for confusion. `awk' opens a separate input stream from the current input file. However, by not using a variable, `$0' and `NR' are still updated. If you're doing this, it's probably by accident, and you should reconsider what it is you're trying to accomplish.  File: gawk.info, Node: Getline Summary, Prev: Getline Notes, Up: Getline 3.8.10 Summary of `getline' Variants ------------------------------------ *note table-getline-variants:: summarizes the eight variants of `getline', listing which built-in variables are set by each one. Variant Effect -------------------------------------------------------------------------- `getline' Sets `$0', `NF', `FNR', and `NR' `getline' VAR Sets VAR, `FNR', and `NR' `getline <' FILE Sets `$0' and `NF' `getline VAR < FILE' Sets VAR COMMAND `| getline' Sets `$0' and `NF' COMMAND `| getline' VAR Sets VAR COMMAND `|& getline' Sets `$0' and `NF'. This is a `gawk' extension COMMAND `|& getline' VAR Sets VAR. This is a `gawk' extension Table 3.1: getline Variants and What They Set  File: gawk.info, Node: Printing, Next: Expressions, Prev: Reading Files, Up: Top 4 Printing Output ***************** One of the most common programming actions is to "print", or output, some or all of the input. Use the `print' statement for simple output, and the `printf' statement for fancier formatting. The `print' statement is not limited when computing _which_ values to print. However, with two exceptions, you cannot specify _how_ to print them--how many columns, whether to use exponential notation or not, and so on. (For the exceptions, *note Output Separators::, and *note OFMT::.) For printing with specifications, you need the `printf' statement (*note Printf::). Besides basic and formatted printing, this major node also covers I/O redirections to files and pipes, introduces the special file names that `gawk' processes internally, and discusses the `close' built-in function. * Menu: * Print:: The `print' statement. * Print Examples:: Simple examples of `print' statements. * Output Separators:: The output separators and how to change them. * OFMT:: Controlling Numeric Output With `print'. * Printf:: The `printf' statement. * Redirection:: How to redirect output to multiple files and pipes. * Special Files:: File name interpretation in `gawk'. `gawk' allows access to inherited file descriptors. * Close Files And Pipes:: Closing Input and Output Files and Pipes.  File: gawk.info, Node: Print, Next: Print Examples, Up: Printing 4.1 The `print' Statement ========================= The `print' statement is used to produce output with simple, standardized formatting. Specify only the strings or numbers to print, in a list separated by commas. They are output, separated by single spaces, followed by a newline. The statement looks like this: print ITEM1, ITEM2, ... The entire list of items may be optionally enclosed in parentheses. The parentheses are necessary if any of the item expressions uses the `>' relational operator; otherwise it could be confused with a redirection (*note Redirection::). The items to print can be constant strings or numbers, fields of the current record (such as `$1'), variables, or any `awk' expression. Numeric values are converted to strings and then printed. The simple statement `print' with no items is equivalent to `print $0': it prints the entire current record. To print a blank line, use `print ""', where `""' is the empty string. To print a fixed piece of text, use a string constant, such as `"Don't Panic"', as one item. If you forget to use the double-quote characters, your text is taken as an `awk' expression, and you will probably get an error. Keep in mind that a space is printed between any two items.  File: gawk.info, Node: Print Examples, Next: Output Separators, Prev: Print, Up: Printing 4.2 Examples of `print' Statements ================================== Each `print' statement makes at least one line of output. However, it isn't limited to only one line. If an item value is a string that contains a newline, the newline is output along with the rest of the string. A single `print' statement can make any number of lines this way. The following is an example of printing a string that contains embedded newlines (the `\n' is an escape sequence, used to represent the newline character; *note Escape Sequences::): $ awk 'BEGIN { print "line one\nline two\nline three" }' -| line one -| line two -| line three The next example, which is run on the `inventory-shipped' file, prints the first two fields of each input record, with a space between them: $ awk '{ print $1, $2 }' inventory-shipped -| Jan 13 -| Feb 15 -| Mar 15 ... A common mistake in using the `print' statement is to omit the comma between two items. This often has the effect of making the items run together in the output, with no space. The reason for this is that juxtaposing two string expressions in `awk' means to concatenate them. Here is the same program, without the comma: $ awk '{ print $1 $2 }' inventory-shipped -| Jan13 -| Feb15 -| Mar15 ... To someone unfamiliar with the `inventory-shipped' file, neither example's output makes much sense. A heading line at the beginning would make it clearer. Let's add some headings to our table of months (`$1') and green crates shipped (`$2'). We do this using the `BEGIN' pattern (*note BEGIN/END::) so that the headings are only printed once: awk 'BEGIN { print "Month Crates" print "----- ------" } { print $1, $2 }' inventory-shipped When run, the program prints the following: Month Crates ----- ------ Jan 13 Feb 15 Mar 15 ... The only problem, however, is that the headings and the table data don't line up! We can fix this by printing some spaces between the two fields: awk 'BEGIN { print "Month Crates" print "----- ------" } { print $1, " ", $2 }' inventory-shipped Lining up columns this way can get pretty complicated when there are many columns to fix. Counting spaces for two or three columns is simple, but any more than this can take up a lot of time. This is why the `printf' statement was created (*note Printf::); one of its specialties is lining up columns of data. NOTE: You can continue either a `print' or `printf' statement simply by putting a newline after any comma (*note Statements/Lines::).  File: gawk.info, Node: Output Separators, Next: OFMT, Prev: Print Examples, Up: Printing 4.3 Output Separators ===================== As mentioned previously, a `print' statement contains a list of items separated by commas. In the output, the items are normally separated by single spaces. However, this doesn't need to be the case; a single space is only the default. Any string of characters may be used as the "output field separator" by setting the built-in variable `OFS'. The initial value of this variable is the string `" "'--that is, a single space. The output from an entire `print' statement is called an "output record". Each `print' statement outputs one output record, and then outputs a string called the "output record separator" (or `ORS'). The initial value of `ORS' is the string `"\n"'; i.e., a newline character. Thus, each `print' statement normally makes a separate line. In order to change how output fields and records are separated, assign new values to the variables `OFS' and `ORS'. The usual place to do this is in the `BEGIN' rule (*note BEGIN/END::), so that it happens before any input is processed. It can also be done with assignments on the command line, before the names of the input files, or using the `-v' command-line option (*note Options::). The following example prints the first and second fields of each input record, separated by a semicolon, with a blank line added after each newline: $ awk 'BEGIN { OFS = ";"; ORS = "\n\n" } > { print $1, $2 }' BBS-list -| aardvark;555-5553 -| -| alpo-net;555-3412 -| -| barfly;555-7685 ... If the value of `ORS' does not contain a newline, the program's output is run together on a single line.  File: gawk.info, Node: OFMT, Next: Printf, Prev: Output Separators, Up: Printing 4.4 Controlling Numeric Output with `print' =========================================== When the `print' statement is used to print numeric values, `awk' internally converts the number to a string of characters and prints that string. `awk' uses the `sprintf' function to do this conversion (*note String Functions::). For now, it suffices to say that the `sprintf' function accepts a "format specification" that tells it how to format numbers (or strings), and that there are a number of different ways in which numbers can be formatted. The different format specifications are discussed more fully in *note Control Letters::. The built-in variable `OFMT' contains the default format specification that `print' uses with `sprintf' when it wants to convert a number to a string for printing. The default value of `OFMT' is `"%.6g"'. The way `print' prints numbers can be changed by supplying different format specifications as the value of `OFMT', as shown in the following example: $ awk 'BEGIN { > OFMT = "%.0f" # print numbers as integers (rounds) > print 17.23, 17.54 }' -| 17 18 According to the POSIX standard, `awk''s behavior is undefined if `OFMT' contains anything but a floating-point conversion specification. (d.c.)  File: gawk.info, Node: Printf, Next: Redirection, Prev: OFMT, Up: Printing 4.5 Using `printf' Statements for Fancier Printing ================================================== For more precise control over the output format than what is normally provided by `print', use `printf'. `printf' can be used to specify the width to use for each item, as well as various formatting choices for numbers (such as what output base to use, whether to print an exponent, whether to print a sign, and how many digits to print after the decimal point). This is done by supplying a string, called the "format string", that controls how and where to print the other arguments. * Menu: * Basic Printf:: Syntax of the `printf' statement. * Control Letters:: Format-control letters. * Format Modifiers:: Format-specification modifiers. * Printf Examples:: Several examples.  File: gawk.info, Node: Basic Printf, Next: Control Letters, Up: Printf 4.5.1 Introduction to the `printf' Statement -------------------------------------------- A simple `printf' statement looks like this: printf FORMAT, ITEM1, ITEM2, ... The entire list of arguments may optionally be enclosed in parentheses. The parentheses are necessary if any of the item expressions use the `>' relational operator; otherwise, it can be confused with a redirection (*note Redirection::). The difference between `printf' and `print' is the FORMAT argument. This is an expression whose value is taken as a string; it specifies how to output each of the other arguments. It is called the "format string". The format string is very similar to that in the ISO C library function `printf'. Most of FORMAT is text to output verbatim. Scattered among this text are "format specifiers"--one per item. Each format specifier says to output the next item in the argument list at that place in the format. The `printf' statement does not automatically append a newline to its output. It outputs only what the format string specifies. So if a newline is needed, you must include one in the format string. The output separator variables `OFS' and `ORS' have no effect on `printf' statements. For example: $ awk 'BEGIN { > ORS = "\nOUCH!\n"; OFS = "+" > msg = "Dont Panic!" > printf "%s\n", msg > }' -| Dont Panic! Here, neither the `+' nor the `OUCH' appear when the message is printed.  File: gawk.info, Node: Control Letters, Next: Format Modifiers, Prev: Basic Printf, Up: Printf 4.5.2 Format-Control Letters ---------------------------- A format specifier starts with the character `%' and ends with a "format-control letter"--it tells the `printf' statement how to output one item. The format-control letter specifies what _kind_ of value to print. The rest of the format specifier is made up of optional "modifiers" that control _how_ to print the value, such as the field width. Here is a list of the format-control letters: `%c' This prints a number as an ASCII character; thus, `printf "%c", 65' outputs the letter `A'. (The output for a string value is the first character of the string.) `%d, %i' These are equivalent; they both print a decimal integer. (The `%i' specification is for compatibility with ISO C.) `%e, %E' These print a number in scientific (exponential) notation; for example: printf "%4.3e\n", 1950 prints `1.950e+03', with a total of four significant figures, three of which follow the decimal point. (The `4.3' represents two modifiers, discussed in the next node.) `%E' uses `E' instead of `e' in the output. `%f' This prints a number in floating-point notation. For example: printf "%4.3f", 1950 prints `1950.000', with a total of four significant figures, three of which follow the decimal point. (The `4.3' represents two modifiers, discussed in the next node.) On systems supporting IEEE 754 floating point format, values representing negative infinity are formatted as `-inf' or `-infinity', and positive infinity as `inf' and `infinity'. The special "not a number" value formats as `-nan' or `nan'. `%F' Like `%f' but the infinity and "not a number" values are spelled using uppercase letters. The `%F' format is a POSIX extension to ISO C; not all systems support it. On those that don't, `gawk' uses `%f' instead. `%g, %G' These print a number in either scientific notation or in floating-point notation, whichever uses fewer characters; if the result is printed in scientific notation, `%G' uses `E' instead of `e'. `%o' This prints an unsigned octal integer. `%s' This prints a string. `%u' This prints an unsigned decimal integer. (This format is of marginal use, because all numbers in `awk' are floating-point; it is provided primarily for compatibility with C.) `%x, %X' These print an unsigned hexadecimal integer; `%X' uses the letters `A' through `F' instead of `a' through `f'. `%%' This isn't a format-control letter, but it does have meaning--the sequence `%%' outputs one `%'; it does not consume an argument and it ignores any modifiers. NOTE: When using the integer format-control letters for values that are outside the range of the widest C integer type, `gawk' switches to the `%g' format specifier. If `--lint' is provided on the command line (*note Options::), `gawk' warns about this. Other versions of `awk' may print invalid values or do something else entirely. (d.c.)  File: gawk.info, Node: Format Modifiers, Next: Printf Examples, Prev: Control Letters, Up: Printf 4.5.3 Modifiers for `printf' Formats ------------------------------------ A format specification can also include "modifiers" that can control how much of the item's value is printed, as well as how much space it gets. The modifiers come between the `%' and the format-control letter. We will use the bullet symbol "*" in the following examples to represent spaces in the output. Here are the possible modifiers, in the order in which they may appear: `N$' An integer constant followed by a `$' is a "positional specifier". Normally, format specifications are applied to arguments in the order given in the format string. With a positional specifier, the format specification is applied to a specific argument, instead of what would be the next argument in the list. Positional specifiers begin counting with one. Thus: printf "%s %s\n", "don't", "panic" printf "%2$s %1$s\n", "panic", "don't" prints the famous friendly message twice. At first glance, this feature doesn't seem to be of much use. It is in fact a `gawk' extension, intended for use in translating messages at runtime. *Note Printf Ordering::, which describes how and why to use positional specifiers. For now, we will not use them. `-' The minus sign, used before the width modifier (see later on in this table), says to left-justify the argument within its specified width. Normally, the argument is printed right-justified in the specified width. Thus: printf "%-4s", "foo" prints `foo*'. `SPACE' For numeric conversions, prefix positive values with a space and negative values with a minus sign. `+' The plus sign, used before the width modifier (see later on in this table), says to always supply a sign for numeric conversions, even if the data to format is positive. The `+' overrides the space modifier. `#' Use an "alternate form" for certain control letters. For `%o', supply a leading zero. For `%x' and `%X', supply a leading `0x' or `0X' for a nonzero result. For `%e', `%E', and `%f', the result always contains a decimal point. For `%g' and `%G', trailing zeros are not removed from the result. `0' A leading `0' (zero) acts as a flag that indicates that output should be padded with zeros instead of spaces. This applies even to non-numeric output formats. (d.c.) This flag only has an effect when the field width is wider than the value to print. `'' A single quote or apostrophe character is a POSIX extension to ISO C. It indicates that the integer part of a floating point value, or the entire part of an integer decimal value, should have a thousands-separator character in it. This only works in locales that support such characters. For example: $ cat thousands.awk Show source program -| BEGIN { printf "%'d\n", 1234567 } $ LC_ALL=C gawk -f thousands.awk -| 1234567 Results in "C" locale $ LC_ALL=en_US.UTF-8 gawk -f thousands.awk -| 1,234,567 Results in US English UTF locale For more information about locales and internationalization issues, see *note Locales::. NOTE: The `'' flag is a nice feature, but its use complicates things: it becomes difficult to use it in command-line programs. For information on appropriate quoting tricks, see *note Quoting::. `WIDTH' This is a number specifying the desired minimum width of a field. Inserting any number between the `%' sign and the format-control character forces the field to expand to this width. The default way to do this is to pad with spaces on the left. For example: printf "%4s", "foo" prints `*foo'. The value of WIDTH is a minimum width, not a maximum. If the item value requires more than WIDTH characters, it can be as wide as necessary. Thus, the following: printf "%4s", "foobar" prints `foobar'. Preceding the WIDTH with a minus sign causes the output to be padded with spaces on the right, instead of on the left. `.PREC' A period followed by an integer constant specifies the precision to use when printing. The meaning of the precision varies by control letter: `%e', `%E', `%f' Number of digits to the right of the decimal point. `%g', `%G' Maximum number of significant digits. `%d', `%i', `%o', `%u', `%x', `%X' Minimum number of digits to print. `%s' Maximum number of characters from the string that should print. Thus, the following: printf "%.4s", "foobar" prints `foob'. The C library `printf''s dynamic WIDTH and PREC capability (for example, `"%*.*s"') is supported. Instead of supplying explicit WIDTH and/or PREC values in the format string, they are passed in the argument list. For example: w = 5 p = 3 s = "abcdefg" printf "%*.*s\n", w, p, s is exactly equivalent to: s = "abcdefg" printf "%5.3s\n", s Both programs output `**abc'. Earlier versions of `awk' did not support this capability. If you must use such a version, you may simulate this feature by using concatenation to build up the format string, like so: w = 5 p = 3 s = "abcdefg" printf "%" w "." p "s\n", s This is not particularly easy to read but it does work. C programmers may be used to supplying additional `l', `L', and `h' modifiers in `printf' format strings. These are not valid in `awk'. Most `awk' implementations silently ignore these modifiers. If `--lint' is provided on the command line (*note Options::), `gawk' warns about their use. If `--posix' is supplied, their use is a fatal error.  File: gawk.info, Node: Printf Examples, Prev: Format Modifiers, Up: Printf 4.5.4 Examples Using `printf' ----------------------------- The following is a simple example of how to use `printf' to make an aligned table: awk '{ printf "%-10s %s\n", $1, $2 }' BBS-list This command prints the names of the bulletin boards (`$1') in the file `BBS-list' as a string of 10 characters that are left-justified. It also prints the phone numbers (`$2') next on the line. This produces an aligned two-column table of names and phone numbers, as shown here: $ awk '{ printf "%-10s %s\n", $1, $2 }' BBS-list -| aardvark 555-5553 -| alpo-net 555-3412 -| barfly 555-7685 -| bites 555-1675 -| camelot 555-0542 -| core 555-2912 -| fooey 555-1234 -| foot 555-6699 -| macfoo 555-6480 -| sdace 555-3430 -| sabafoo 555-2127 In this case, the phone numbers had to be printed as strings because the numbers are separated by a dash. Printing the phone numbers as numbers would have produced just the first three digits: `555'. This would have been pretty confusing. It wasn't necessary to specify a width for the phone numbers because they are last on their lines. They don't need to have spaces after them. The table could be made to look even nicer by adding headings to the tops of the columns. This is done using the `BEGIN' pattern (*note BEGIN/END::) so that the headers are only printed once, at the beginning of the `awk' program: awk 'BEGIN { print "Name Number" print "---- ------" } { printf "%-10s %s\n", $1, $2 }' BBS-list The above example mixed `print' and `printf' statements in the same program. Using just `printf' statements can produce the same results: awk 'BEGIN { printf "%-10s %s\n", "Name", "Number" printf "%-10s %s\n", "----", "------" } { printf "%-10s %s\n", $1, $2 }' BBS-list Printing each column heading with the same format specification used for the column elements ensures that the headings are aligned just like the columns. The fact that the same format specification is used three times can be emphasized by storing it in a variable, like this: awk 'BEGIN { format = "%-10s %s\n" printf format, "Name", "Number" printf format, "----", "------" } { printf format, $1, $2 }' BBS-list At this point, it would be a worthwhile exercise to use the `printf' statement to line up the headings and table data for the `inventory-shipped' example that was covered earlier in the minor node on the `print' statement (*note Print::).  File: gawk.info, Node: Redirection, Next: Special Files, Prev: Printf, Up: Printing 4.6 Redirecting Output of `print' and `printf' ============================================== So far, the output from `print' and `printf' has gone to the standard output, usually the terminal. Both `print' and `printf' can also send their output to other places. This is called "redirection". A redirection appears after the `print' or `printf' statement. Redirections in `awk' are written just like redirections in shell commands, except that they are written inside the `awk' program. There are four forms of output redirection: output to a file, output appended to a file, output through a pipe to another command, and output to a coprocess. They are all shown for the `print' statement, but they work identically for `printf': `print ITEMS > OUTPUT-FILE' This type of redirection prints the items into the output file named OUTPUT-FILE. The file name OUTPUT-FILE can be any expression. Its value is changed to a string and then used as a file name (*note Expressions::). When this type of redirection is used, the OUTPUT-FILE is erased before the first output is written to it. Subsequent writes to the same OUTPUT-FILE do not erase OUTPUT-FILE, but append to it. (This is different from how you use redirections in shell scripts.) If OUTPUT-FILE does not exist, it is created. For example, here is how an `awk' program can write a list of BBS names to one file named `name-list', and a list of phone numbers to another file named `phone-list': $ awk '{ print $2 > "phone-list" > print $1 > "name-list" }' BBS-list $ cat phone-list -| 555-5553 -| 555-3412 ... $ cat name-list -| aardvark -| alpo-net ... Each output file contains one name or number per line. `print ITEMS >> OUTPUT-FILE' This type of redirection prints the items into the pre-existing output file named OUTPUT-FILE. The difference between this and the single-`>' redirection is that the old contents (if any) of OUTPUT-FILE are not erased. Instead, the `awk' output is appended to the file. If OUTPUT-FILE does not exist, then it is created. `print ITEMS | COMMAND' It is also possible to send output to another program through a pipe instead of into a file. This type of redirection opens a pipe to COMMAND, and writes the values of ITEMS through this pipe to another process created to execute COMMAND. The redirection argument COMMAND is actually an `awk' expression. Its value is converted to a string whose contents give the shell command to be run. For example, the following produces two files, one unsorted list of BBS names, and one list sorted in reverse alphabetical order: awk '{ print $1 > "names.unsorted" command = "sort -r > names.sorted" print $1 | command }' BBS-list The unsorted list is written with an ordinary redirection, while the sorted list is written by piping through the `sort' utility. The next example uses redirection to mail a message to the mailing list `bug-system'. This might be useful when trouble is encountered in an `awk' script run periodically for system maintenance: report = "mail bug-system" print "Awk script failed:", $0 | report m = ("at record number " FNR " of " FILENAME) print m | report close(report) The message is built using string concatenation and saved in the variable `m'. It's then sent down the pipeline to the `mail' program. (The parentheses group the items to concatenate--see *note Concatenation::.) The `close' function is called here because it's a good idea to close the pipe as soon as all the intended output has been sent to it. *Note Close Files And Pipes::, for more information. This example also illustrates the use of a variable to represent a FILE or COMMAND--it is not necessary to always use a string constant. Using a variable is generally a good idea, because (if you mean to refer to that same file or command) `awk' requires that the string value be spelled identically every time. `print ITEMS |& COMMAND' This type of redirection prints the items to the input of COMMAND. The difference between this and the single-`|' redirection is that the output from COMMAND can be read with `getline'. Thus COMMAND is a "coprocess", which works together with, but subsidiary to, the `awk' program. This feature is a `gawk' extension, and is not available in POSIX `awk'. *Note Getline/Coprocess::, for a brief discussion. *Note Two-way I/O::, for a more complete discussion. Redirecting output using `>', `>>', `|', or `|&' asks the system to open a file, pipe, or coprocess only if the particular FILE or COMMAND you specify has not already been written to by your program or if it has been closed since it was last written to. It is a common error to use `>' redirection for the first `print' to a file, and then to use `>>' for subsequent output: # clear the file print "Don't panic" > "guide.txt" ... # append print "Avoid improbability generators" >> "guide.txt" This is indeed how redirections must be used from the shell. But in `awk', it isn't necessary. In this kind of case, a program should use `>' for all the `print' statements, since the output file is only opened once. (It happens that if you mix `>' and `>>' that output is produced in the expected order. However, mixing the operators for the same file is definitely poor style, and is confusing to readers of your program.) Many `awk' implementations limit the number of pipelines that an `awk' program may have open to just one! In `gawk', there is no such limit. `gawk' allows a program to open as many pipelines as the underlying operating system permits. Advanced Notes: Piping into `sh' -------------------------------- A particularly powerful way to use redirection is to build command lines and pipe them into the shell, `sh'. For example, suppose you have a list of files brought over from a system where all the file names are stored in uppercase, and you wish to rename them to have names in all lowercase. The following program is both simple and efficient: { printf("mv %s %s\n", $0, tolower($0)) | "sh" } END { close("sh") } The `tolower' function returns its argument string with all uppercase characters converted to lowercase (*note String Functions::). The program builds up a list of command lines, using the `mv' utility to rename the files. It then sends the list to the shell for execution.  File: gawk.info, Node: Special Files, Next: Close Files And Pipes, Prev: Redirection, Up: Printing 4.7 Special File Names in `gawk' ================================ `gawk' provides a number of special file names that it interprets internally. These file names provide access to standard file descriptors, process-related information, and TCP/IP networking. * Menu: * Special FD:: Special files for I/O. * Special Process:: Special files for process information. * Special Network:: Special files for network communications. * Special Caveats:: Things to watch out for.  File: gawk.info, Node: Special FD, Next: Special Process, Up: Special Files 4.7.1 Special Files for Standard Descriptors -------------------------------------------- Running programs conventionally have three input and output streams already available to them for reading and writing. These are known as the "standard input", "standard output", and "standard error output". These streams are, by default, connected to your terminal, but they are often redirected with the shell, via the `<', `<<', `>', `>>', `>&', and `|' operators. Standard error is typically used for writing error messages; the reason there are two separate streams, standard output and standard error, is so that they can be redirected separately. In other implementations of `awk', the only way to write an error message to standard error in an `awk' program is as follows: print "Serious error detected!" | "cat 1>&2" This works by opening a pipeline to a shell command that can access the standard error stream that it inherits from the `awk' process. This is far from elegant, and it is also inefficient, because it requires a separate process. So people writing `awk' programs often don't do this. Instead, they send the error messages to the terminal, like this: print "Serious error detected!" > "/dev/tty" This usually has the same effect but not always: although the standard error stream is usually the terminal, it can be redirected; when that happens, writing to the terminal is not correct. In fact, if `awk' is run from a background job, it may not have a terminal at all. Then opening `/dev/tty' fails. `gawk' provides special file names for accessing the three standard streams, as well as any other inherited open files. If the file name matches one of these special names when `gawk' redirects input or output, then it directly uses the stream that the file name stands for. These special file names work for all operating systems that `gawk' has been ported to, not just those that are POSIX-compliant: `/dev/stdin' The standard input (file descriptor 0). `/dev/stdout' The standard output (file descriptor 1). `/dev/stderr' The standard error output (file descriptor 2). `/dev/fd/N' The file associated with file descriptor N. Such a file must be opened by the program initiating the `awk' execution (typically the shell). Unless special pains are taken in the shell from which `gawk' is invoked, only descriptors 0, 1, and 2 are available. The file names `/dev/stdin', `/dev/stdout', and `/dev/stderr' are aliases for `/dev/fd/0', `/dev/fd/1', and `/dev/fd/2', respectively. However, they are more self-explanatory. The proper way to write an error message in a `gawk' program is to use `/dev/stderr', like this: print "Serious error detected!" > "/dev/stderr" Note the use of quotes around the file name. Like any other redirection, the value must be a string. It is a common error to omit the quotes, which leads to confusing results.  File: gawk.info, Node: Special Process, Next: Special Network, Prev: Special FD, Up: Special Files 4.7.2 Special Files for Process-Related Information --------------------------------------------------- `gawk' also provides special file names that give access to information about the running `gawk' process. Each of these "files" provides a single record of information. To read them more than once, they must first be closed with the `close' function (*note Close Files And Pipes::). The file names are: `/dev/pid' Reading this file returns the process ID of the current process, in decimal form, terminated with a newline. `/dev/ppid' Reading this file returns the parent process ID of the current process, in decimal form, terminated with a newline. `/dev/pgrpid' Reading this file returns the process group ID of the current process, in decimal form, terminated with a newline. `/dev/user' Reading this file returns a single record terminated with a newline. The fields are separated with spaces. The fields represent the following information: `$1' The return value of the `getuid' system call (the real user ID number). `$2' The return value of the `geteuid' system call (the effective user ID number). `$3' The return value of the `getgid' system call (the real group ID number). `$4' The return value of the `getegid' system call (the effective group ID number). If there are any additional fields, they are the group IDs returned by the `getgroups' system call. (Multiple groups may not be supported on all systems.) These special file names may be used on the command line as data files, as well as for I/O redirections within an `awk' program. They may not be used as source files with the `-f' option. NOTE: The special files that provide process-related information are now considered obsolete and will disappear entirely in the next release of `gawk'. `gawk' prints a warning message every time you use one of these files. To obtain process-related information, use the `PROCINFO' array. *Note Auto-set::.  File: gawk.info, Node: Special Network, Next: Special Caveats, Prev: Special Process, Up: Special Files 4.7.3 Special Files for Network Communications ---------------------------------------------- Starting with version 3.1 of `gawk', `awk' programs can open a two-way TCP/IP connection, acting as either a client or a server. This is done using a special file name of the form: `/inet/PROTOCOL/LOCAL-PORT/REMOTE-HOST/REMOTE-PORT' The PROTOCOL is one of `tcp', `udp', or `raw', and the other fields represent the other essential pieces of information for making a networking connection. These file names are used with the `|&' operator for communicating with a coprocess (*note Two-way I/O::). This is an advanced feature, mentioned here only for completeness. Full discussion is delayed until *note TCP/IP Networking::.  File: gawk.info, Node: Special Caveats, Prev: Special Network, Up: Special Files 4.7.4 Special File Name Caveats ------------------------------- Here is a list of things to bear in mind when using the special file names that `gawk' provides: * Recognition of these special file names is disabled if `gawk' is in compatibility mode (*note Options::). * The special files that provide process-related information are now considered obsolete and will disappear entirely in the next release of `gawk'. `gawk' prints a warning message every time you use one of these files. To obtain process-related information, use the `PROCINFO' array. *Note Built-in Variables::. * Starting with version 3.1, `gawk' _always_ interprets these special file names.(1) For example, using `/dev/fd/4' for output actually writes on file descriptor 4, and not on a new file descriptor that is `dup''ed from file descriptor 4. Most of the time this does not matter; however, it is important to _not_ close any of the files related to file descriptors 0, 1, and 2. Doing so results in unpredictable behavior. ---------- Footnotes ---------- (1) Older versions of `gawk' would interpret these names internally only if the system did not actually have a `/dev/fd' directory or any of the other special files listed earlier. Usually this didn't make a difference, but sometimes it did; thus, it was decided to make `gawk''s behavior consistent on all systems and to have it always interpret the special file names itself.  File: gawk.info, Node: Close Files And Pipes, Prev: Special Files, Up: Printing 4.8 Closing Input and Output Redirections ========================================= If the same file name or the same shell command is used with `getline' more than once during the execution of an `awk' program (*note Getline::), the file is opened (or the command is executed) the first time only. At that time, the first record of input is read from that file or command. The next time the same file or command is used with `getline', another record is read from it, and so on. Similarly, when a file or pipe is opened for output, the file name or command associated with it is remembered by `awk', and subsequent writes to the same file or command are appended to the previous writes. The file or pipe stays open until `awk' exits. This implies that special steps are necessary in order to read the same file again from the beginning, or to rerun a shell command (rather than reading more output from the same command). The `close' function makes these things possible: close(FILENAME) or: close(COMMAND) The argument FILENAME or COMMAND can be any expression. Its value must _exactly_ match the string that was used to open the file or start the command (spaces and other "irrelevant" characters included). For example, if you open a pipe with this: "sort -r names" | getline foo then you must close it with this: close("sort -r names") Once this function call is executed, the next `getline' from that file or command, or the next `print' or `printf' to that file or command, reopens the file or reruns the command. Because the expression that you use to close a file or pipeline must exactly match the expression used to open the file or run the command, it is good practice to use a variable to store the file name or command. The previous example becomes the following: sortcom = "sort -r names" sortcom | getline foo ... close(sortcom) This helps avoid hard-to-find typographical errors in your `awk' programs. Here are some of the reasons for closing an output file: * To write a file and read it back later on in the same `awk' program. Close the file after writing it, then begin reading it with `getline'. * To write numerous files, successively, in the same `awk' program. If the files aren't closed, eventually `awk' may exceed a system limit on the number of open files in one process. It is best to close each one when the program has finished writing it. * To make a command finish. When output is redirected through a pipe, the command reading the pipe normally continues to try to read input as long as the pipe is open. Often this means the command cannot really do its work until the pipe is closed. For example, if output is redirected to the `mail' program, the message is not actually sent until the pipe is closed. * To run the same program a second time, with the same arguments. This is not the same thing as giving more input to the first run! For example, suppose a program pipes output to the `mail' program. If it outputs several lines redirected to this pipe without closing it, they make a single message of several lines. By contrast, if the program closes the pipe after each line of output, then each line makes a separate message. If you use more files than the system allows you to have open, `gawk' attempts to multiplex the available open files among your data files. `gawk''s ability to do this depends upon the facilities of your operating system, so it may not always work. It is therefore both good practice and good portability advice to always use `close' on your files when you are done with them. In fact, if you are using a lot of pipes, it is essential that you close commands when done. For example, consider something like this: { ... command = ("grep " $1 " /some/file | my_prog -q " $3) while ((command | getline) > 0) { PROCESS OUTPUT OF command } # need close(command) here } This example creates a new pipeline based on data in _each_ record. Without the call to `close' indicated in the comment, `awk' creates child processes to run the commands, until it eventually runs out of file descriptors for more pipelines. Even though each command has finished (as indicated by the end-of-file return status from `getline'), the child process is not terminated;(1) more importantly, the file descriptor for the pipe is not closed and released until `close' is called or `awk' exits. `close' will silently do nothing if given an argument that does not represent a file, pipe or coprocess that was opened with a redirection. Note also that `close(FILENAME)' has no "magic" effects on the implicit loop that reads through the files named on the command line. It is, more likely, a close of a file that was never opened, so `awk' silently does nothing. When using the `|&' operator to communicate with a coprocess, it is occasionally useful to be able to close one end of the two-way pipe without closing the other. This is done by supplying a second argument to `close'. As in any other call to `close', the first argument is the name of the command or special file used to start the coprocess. The second argument should be a string, with either of the values `"to"' or `"from"'. Case does not matter. As this is an advanced feature, a more complete discussion is delayed until *note Two-way I/O::, which discusses it in more detail and gives an example. Advanced Notes: Using `close''s Return Value -------------------------------------------- In many versions of Unix `awk', the `close' function is actually a statement. It is a syntax error to try and use the return value from `close': (d.c.) command = "..." command | getline info retval = close(command) # syntax error in most Unix awks `gawk' treats `close' as a function. The return value is -1 if the argument names something that was never opened with a redirection, or if there is a system problem closing the file or process. In these cases, `gawk' sets the built-in variable `ERRNO' to a string describing the problem. In `gawk', when closing a pipe or coprocess (input or output), the return value is the exit status of the command.(2) Otherwise, it is the return value from the system's `close' or `fclose' C functions when closing input or output files, respectively. This value is zero if the close succeeds, or -1 if it fails. The POSIX standard is very vague; it says that `close' returns zero on success and non-zero otherwise. In general, different implementations vary in what they report when closing pipes; thus the return value cannot be used portably. (d.c.) ---------- Footnotes ---------- (1) The technical terminology is rather morbid. The finished child is called a "zombie," and cleaning up after it is referred to as "reaping." (2) This is a full 16-bit value as returned by the `wait' system call. See the system manual pages for information on how to decode this value.  File: gawk.info, Node: Expressions, Next: Patterns and Actions, Prev: Printing, Up: Top 5 Expressions ************* Expressions are the basic building blocks of `awk' patterns and actions. An expression evaluates to a value that you can print, test, or pass to a function. Additionally, an expression can assign a new value to a variable or a field by using an assignment operator. An expression can serve as a pattern or action statement on its own. Most other kinds of statements contain one or more expressions that specify the data on which to operate. As in other languages, expressions in `awk' include variables, array references, constants, and function calls, as well as combinations of these with various operators. * Menu: * Constants:: String, numeric and regexp constants. * Using Constant Regexps:: When and how to use a regexp constant. * Variables:: Variables give names to values for later use. * Conversion:: The conversion of strings to numbers and vice versa. * Arithmetic Ops:: Arithmetic operations (`+', `-', etc.) * Concatenation:: Concatenating strings. * Assignment Ops:: Changing the value of a variable or a field. * Increment Ops:: Incrementing the numeric value of a variable. * Truth Values:: What is ``true'' and what is ``false''. * Typing and Comparison:: How variables acquire types and how this affects comparison of numbers and strings with `<', etc. * Boolean Ops:: Combining comparison expressions using boolean operators `||' (``or''), `&&' (``and'') and `!' (``not''). * Conditional Exp:: Conditional expressions select between two subexpressions under control of a third subexpression. * Function Calls:: A function call is an expression. * Precedence:: How various operators nest.  File: gawk.info, Node: Constants, Next: Using Constant Regexps, Up: Expressions 5.1 Constant Expressions ======================== The simplest type of expression is the "constant", which always has the same value. There are three types of constants: numeric, string, and regular expression. Each is used in the appropriate context when you need a data value that isn't going to change. Numeric constants can have different forms, but are stored identically internally. * Menu: * Scalar Constants:: Numeric and string constants. * Nondecimal-numbers:: What are octal and hex numbers. * Regexp Constants:: Regular Expression constants.  File: gawk.info, Node: Scalar Constants, Next: Nondecimal-numbers, Up: Constants 5.1.1 Numeric and String Constants ---------------------------------- A "numeric constant" stands for a number. This number can be an integer, a decimal fraction, or a number in scientific (exponential) notation.(1) Here are some examples of numeric constants that all have the same value: 105 1.05e+2 1050e-1 A string constant consists of a sequence of characters enclosed in double-quotation marks. For example: "parrot" represents the string whose contents are `parrot'. Strings in `gawk' can be of any length, and they can contain any of the possible eight-bit ASCII characters including ASCII NUL (character code zero). Other `awk' implementations may have difficulty with some character codes. ---------- Footnotes ---------- (1) The internal representation of all numbers, including integers, uses double-precision floating-point numbers. On most modern systems, these are in IEEE 754 standard format.  File: gawk.info, Node: Nondecimal-numbers, Next: Regexp Constants, Prev: Scalar Constants, Up: Constants 5.1.2 Octal and Hexadecimal Numbers ----------------------------------- In `awk', all numbers are in decimal; i.e., base 10. Many other programming languages allow you to specify numbers in other bases, often octal (base 8) and hexadecimal (base 16). In octal, the numbers go 0, 1, 2, 3, 4, 5, 6, 7, 10, 11, 12, etc. Just as `11', in decimal, is 1 times 10 plus 1, so `11', in octal, is 1 times 8, plus 1. This equals 9 in decimal. In hexadecimal, there are 16 digits. Since the everyday decimal number system only has ten digits (`0'-`9'), the letters `a' through `f' are used to represent the rest. (Case in the letters is usually irrelevant; hexadecimal `a' and `A' have the same value.) Thus, `11', in hexadecimal, is 1 times 16 plus 1, which equals 17 in decimal. Just by looking at plain `11', you can't tell what base it's in. So, in C, C++, and other languages derived from C, there is a special notation to help signify the base. Octal numbers start with a leading `0', and hexadecimal numbers start with a leading `0x' or `0X': `11' Decimal value 11. `011' Octal 11, decimal value 9. `0x11' Hexadecimal 11, decimal value 17. This example shows the difference: $ gawk 'BEGIN { printf "%d, %d, %d\n", 011, 11, 0x11 }' -| 9, 11, 17 Being able to use octal and hexadecimal constants in your programs is most useful when working with data that cannot be represented conveniently as characters or as regular numbers, such as binary data of various sorts. `gawk' allows the use of octal and hexadecimal constants in your program text. However, such numbers in the input data are not treated differently; doing so by default would break old programs. (If you really need to do this, use the `--non-decimal-data' command-line option; *note Nondecimal Data::.) If you have octal or hexadecimal data, you can use the `strtonum' function (*note String Functions::) to convert the data into a number. Most of the time, you will want to use octal or hexadecimal constants when working with the built-in bit manipulation functions; see *note Bitwise Functions::, for more information. Unlike some early C implementations, `8' and `9' are not valid in octal constants; e.g., `gawk' treats `018' as decimal 18: $ gawk 'BEGIN { print "021 is", 021 ; print 018 }' -| 021 is 17 -| 18 Octal and hexadecimal source code constants are a `gawk' extension. If `gawk' is in compatibility mode (*note Options::), they are not available. Advanced Notes: A Constant's Base Does Not Affect Its Value ----------------------------------------------------------- Once a numeric constant has been converted internally into a number, `gawk' no longer remembers what the original form of the constant was; the internal value is always used. This has particular consequences for conversion of numbers to strings: $ gawk 'BEGIN { printf "0x11 is <%s>\n", 0x11 }' -| 0x11 is <17>  File: gawk.info, Node: Regexp Constants, Prev: Nondecimal-numbers, Up: Constants 5.1.3 Regular Expression Constants ---------------------------------- A regexp constant is a regular expression description enclosed in slashes, such as `/^beginning and end$/'. Most regexps used in `awk' programs are constant, but the `~' and `!~' matching operators can also match computed or "dynamic" regexps (which are just ordinary strings or variables that contain a regexp).  File: gawk.info, Node: Using Constant Regexps, Next: Variables, Prev: Constants, Up: Expressions 5.2 Using Regular Expression Constants ====================================== When used on the righthand side of the `~' or `!~' operators, a regexp constant merely stands for the regexp that is to be matched. However, regexp constants (such as `/foo/') may be used like simple expressions. When a regexp constant appears by itself, it has the same meaning as if it appeared in a pattern, i.e., `($0 ~ /foo/)' (d.c.) *Note Expression Patterns::. This means that the following two code segments: if ($0 ~ /barfly/ || $0 ~ /camelot/) print "found" and: if (/barfly/ || /camelot/) print "found" are exactly equivalent. One rather bizarre consequence of this rule is that the following Boolean expression is valid, but does not do what the user probably intended: # note that /foo/ is on the left of the ~ if (/foo/ ~ $1) print "found foo" This code is "obviously" testing `$1' for a match against the regexp `/foo/'. But in fact, the expression `/foo/ ~ $1' actually means `($0 ~ /foo/) ~ $1'. In other words, first match the input record against the regexp `/foo/'. The result is either zero or one, depending upon the success or failure of the match. That result is then matched against the first field in the record. Because it is unlikely that you would ever really want to make this kind of test, `gawk' issues a warning when it sees this construct in a program. Another consequence of this rule is that the assignment statement: matches = /foo/ assigns either zero or one to the variable `matches', depending upon the contents of the current input record. This feature of the language has never been well documented until the POSIX specification. Constant regular expressions are also used as the first argument for the `gensub', `sub', and `gsub' functions, and as the second argument of the `match' function (*note String Functions::). Modern implementations of `awk', including `gawk', allow the third argument of `split' to be a regexp constant, but some older implementations do not. (d.c.) This can lead to confusion when attempting to use regexp constants as arguments to user-defined functions (*note User-defined::). For example: function mysub(pat, repl, str, global) { if (global) gsub(pat, repl, str) else sub(pat, repl, str) return str } { ... text = "hi! hi yourself!" mysub(/hi/, "howdy", text, 1) ... } In this example, the programmer wants to pass a regexp constant to the user-defined function `mysub', which in turn passes it on to either `sub' or `gsub'. However, what really happens is that the `pat' parameter is either one or zero, depending upon whether or not `$0' matches `/hi/'. `gawk' issues a warning when it sees a regexp constant used as a parameter to a user-defined function, since passing a truth value in this way is probably not what was intended.  File: gawk.info, Node: Variables, Next: Conversion, Prev: Using Constant Regexps, Up: Expressions 5.3 Variables ============= Variables are ways of storing values at one point in your program for use later in another part of your program. They can be manipulated entirely within the program text, and they can also be assigned values on the `awk' command line. * Menu: * Using Variables:: Using variables in your programs. * Assignment Options:: Setting variables on the command-line and a summary of command-line syntax. This is an advanced method of input.  File: gawk.info, Node: Using Variables, Next: Assignment Options, Up: Variables 5.3.1 Using Variables in a Program ---------------------------------- Variables let you give names to values and refer to them later. Variables have already been used in many of the examples. The name of a variable must be a sequence of letters, digits, or underscores, and it may not begin with a digit. Case is significant in variable names; `a' and `A' are distinct variables. A variable name is a valid expression by itself; it represents the variable's current value. Variables are given new values with "assignment operators", "increment operators", and "decrement operators". *Note Assignment Ops::. A few variables have special built-in meanings, such as `FS' (the field separator), and `NF' (the number of fields in the current input record). *Note Built-in Variables::, for a list of the built-in variables. These built-in variables can be used and assigned just like all other variables, but their values are also used or changed automatically by `awk'. All built-in variables' names are entirely uppercase. Variables in `awk' can be assigned either numeric or string values. The kind of value a variable holds can change over the life of a program. By default, variables are initialized to the empty string, which is zero if converted to a number. There is no need to "initialize" each variable explicitly in `awk', which is what you would do in C and in most other traditional languages.  File: gawk.info, Node: Assignment Options, Prev: Using Variables, Up: Variables 5.3.2 Assigning Variables on the Command Line --------------------------------------------- Any `awk' variable can be set by including a "variable assignment" among the arguments on the command line when `awk' is invoked (*note Other Arguments::). Such an assignment has the following form: VARIABLE=TEXT With it, a variable is set either at the beginning of the `awk' run or in between input files. When the assignment is preceded with the `-v' option, as in the following: -v VARIABLE=TEXT the variable is set at the very beginning, even before the `BEGIN' rules are run. The `-v' option and its assignment must precede all the file name arguments, as well as the program text. (*Note Options::, for more information about the `-v' option.) Otherwise, the variable assignment is performed at a time determined by its position among the input file arguments--after the processing of the preceding input file argument. For example: awk '{ print $n }' n=4 inventory-shipped n=2 BBS-list prints the value of field number `n' for all input records. Before the first file is read, the command line sets the variable `n' equal to four. This causes the fourth field to be printed in lines from the file `inventory-shipped'. After the first file has finished, but before the second file is started, `n' is set to two, so that the second field is printed in lines from `BBS-list': $ awk '{ print $n }' n=4 inventory-shipped n=2 BBS-list -| 15 -| 24 ... -| 555-5553 -| 555-3412 ... Command-line arguments are made available for explicit examination by the `awk' program in the `ARGV' array (*note ARGC and ARGV::). `awk' processes the values of command-line assignments for escape sequences (*note Escape Sequences::). (d.c.)  File: gawk.info, Node: Conversion, Next: Arithmetic Ops, Prev: Variables, Up: Expressions 5.4 Conversion of Strings and Numbers ===================================== Strings are converted to numbers and numbers are converted to strings, if the context of the `awk' program demands it. For example, if the value of either `foo' or `bar' in the expression `foo + bar' happens to be a string, it is converted to a number before the addition is performed. If numeric values appear in string concatenation, they are converted to strings. Consider the following: two = 2; three = 3 print (two three) + 4 This prints the (numeric) value 27. The numeric values of the variables `two' and `three' are converted to strings and concatenated together. The resulting string is converted back to the number 23, to which 4 is then added. If, for some reason, you need to force a number to be converted to a string, concatenate the empty string, `""', with that number. To force a string to be converted to a number, add zero to that string. A string is converted to a number by interpreting any numeric prefix of the string as numerals: `"2.5"' converts to 2.5, `"1e3"' converts to 1000, and `"25fix"' has a numeric value of 25. Strings that can't be interpreted as valid numbers convert to zero. The exact manner in which numbers are converted into strings is controlled by the `awk' built-in variable `CONVFMT' (*note Built-in Variables::). Numbers are converted using the `sprintf' function with `CONVFMT' as the format specifier (*note String Functions::). `CONVFMT''s default value is `"%.6g"', which prints a value with at least six significant digits. For some applications, you might want to change it to specify more precision. On most modern machines, 17 digits is enough to capture a floating-point number's value exactly, most of the time.(1) Strange results can occur if you set `CONVFMT' to a string that doesn't tell `sprintf' how to format floating-point numbers in a useful way. For example, if you forget the `%' in the format, `awk' converts all numbers to the same constant string. As a special case, if a number is an integer, then the result of converting it to a string is _always_ an integer, no matter what the value of `CONVFMT' may be. Given the following code fragment: CONVFMT = "%2.2f" a = 12 b = a "" `b' has the value `"12"', not `"12.00"'. (d.c.) Prior to the POSIX standard, `awk' used the value of `OFMT' for converting numbers to strings. `OFMT' specifies the output format to use when printing numbers with `print'. `CONVFMT' was introduced in order to separate the semantics of conversion from the semantics of printing. Both `CONVFMT' and `OFMT' have the same default value: `"%.6g"'. In the vast majority of cases, old `awk' programs do not change their behavior. However, these semantics for `OFMT' are something to keep in mind if you must port your new style program to older implementations of `awk'. We recommend that instead of changing your programs, just port `gawk' itself. *Note Print::, for more information on the `print' statement. And, once again, where you are can matter when it comes to converting between numbers and strings. In *note Locales::, we mentioned that the local character set and language (the locale) can affect how `gawk' matches characters. The locale also affects numeric formats. In particular, for `awk' programs, it affects the decimal point character. The `"C"' locale, and most English-language locales, use the period character (`.') as the decimal point. However, many (if not most) European and non-English locales use the comma (`,') as the decimal point character. The POSIX standard says that `awk' always uses the period as the decimal point when reading the `awk' program source code, and for command-line variable assignments (*note Other Arguments::). However, when interpreting input data, for `print' and `printf' output, and for number to string conversion, the local decimal point character is used. Here are some examples indicating the difference in behavior, on a GNU/Linux system: $ gawk 'BEGIN { printf "%g\n", 3.1415927 }' -| 3.14159 $ LC_ALL=en_DK gawk 'BEGIN { printf "%g\n", 3.1415927 }' -| 3,14159 $ echo 4,321 | gawk '{ print $1 + 1 }' -| 5 $ echo 4,321 | LC_ALL=en_DK gawk '{ print $1 + 1 }' -| 5,321 The `en_DK' locale is for English in Denmark, where the comma acts as the decimal point separator. In the normal `"C"' locale, `gawk' treats `4,321' as `4', while in the Danish locale, it's treated as the full number, `4.321'. For version 3.1.3 through 3.1.5, `gawk' fully complied with this aspect of the standard. However, many users in non-English locales complained about this behavior, since their data used a period as the decimal point. Beginning in version 3.1.6, the default behavior was restored to use a period as the decimal point character. You can use the `--use-lc-numeric' option (*note Options::) to force `gawk' to use the locale's decimal point character. (`gawk' also uses the locale's decimal point character when in POSIX mode, either via `--posix', or the `POSIXLY_CORRECT' environment variable.) The following table describes the cases in which the locale's decimal point character is used and when a period is used. Some of these features have not been described yet. Feature Default `--posix' or `--use-lc-numeric' ------------------------------------------------------------ `%'g' Use locale Use locale `%g' Use period Use locale Input Use period Use locale `strtonum' Use period Use locale Table 5.1: Locale Decimal Point versus A Period Finally, modern day formal standards and IEEE standard floating point representation can have an unusual but important effect on the way `gawk' converts some special string values to numbers. The details are presented in *note POSIX Floating Point Problems::. ---------- Footnotes ---------- (1) Pathological cases can require up to 752 digits (!), but we doubt that you need to worry about this.  File: gawk.info, Node: Arithmetic Ops, Next: Concatenation, Prev: Conversion, Up: Expressions 5.5 Arithmetic Operators ======================== The `awk' language uses the common arithmetic operators when evaluating expressions. All of these arithmetic operators follow normal precedence rules and work as you would expect them to. The following example uses a file named `grades', which contains a list of student names as well as three test scores per student (it's a small class): Pat 100 97 58 Sandy 84 72 93 Chris 72 92 89 This programs takes the file `grades' and prints the average of the scores: $ awk '{ sum = $2 + $3 + $4 ; avg = sum / 3 > print $1, avg }' grades -| Pat 85 -| Sandy 83 -| Chris 84.3333 The following list provides the arithmetic operators in `awk', in order from the highest precedence to the lowest: `- X' Negation. `+ X' Unary plus; the expression is converted to a number. `X ^ Y' `X ** Y' Exponentiation; X raised to the Y power. `2 ^ 3' has the value eight; the character sequence `**' is equivalent to `^'. `X * Y' Multiplication. `X / Y' Division; because all numbers in `awk' are floating-point numbers, the result is _not_ rounded to an integer--`3 / 4' has the value 0.75. (It is a common mistake, especially for C programmers, to forget that _all_ numbers in `awk' are floating-point, and that division of integer-looking constants produces a real number, not an integer.) `X % Y' Remainder; further discussion is provided in the text, just after this list. `X + Y' Addition. `X - Y' Subtraction. Unary plus and minus have the same precedence, the multiplication operators all have the same precedence, and addition and subtraction have the same precedence. When computing the remainder of `X % Y', the quotient is rounded toward zero to an integer and multiplied by Y. This result is subtracted from X; this operation is sometimes known as "trunc-mod." The following relation always holds: b * int(a / b) + (a % b) == a One possibly undesirable effect of this definition of remainder is that `X % Y' is negative if X is negative. Thus: -17 % 8 = -1 In other `awk' implementations, the signedness of the remainder may be machine-dependent. NOTE: The POSIX standard only specifies the use of `^' for exponentiation. For maximum portability, do not use the `**' operator.  File: gawk.info, Node: Concatenation, Next: Assignment Ops, Prev: Arithmetic Ops, Up: Expressions 5.6 String Concatenation ======================== It seemed like a good idea at the time. Brian Kernighan There is only one string operation: concatenation. It does not have a specific operator to represent it. Instead, concatenation is performed by writing expressions next to one another, with no operator. For example: $ awk '{ print "Field number one: " $1 }' BBS-list -| Field number one: aardvark -| Field number one: alpo-net ... Without the space in the string constant after the `:', the line runs together. For example: $ awk '{ print "Field number one:" $1 }' BBS-list -| Field number one:aardvark -| Field number one:alpo-net ... Because string concatenation does not have an explicit operator, it is often necessary to insure that it happens at the right time by using parentheses to enclose the items to concatenate. For example, you might expect that the following code fragment concatenates `file' and `name': file = "file" name = "name" print "something meaningful" > file name This produces a syntax error with Unix `awk'.(1) It is necessary to use the following: print "something meaningful" > (file name) Parentheses should be used around concatenation in all but the most common contexts, such as on the righthand side of `='. Be careful about the kinds of expressions used in string concatenation. In particular, the order of evaluation of expressions used for concatenation is undefined in the `awk' language. Consider this example: BEGIN { a = "don't" print (a " " (a = "panic")) } It is not defined whether the assignment to `a' happens before or after the value of `a' is retrieved for producing the concatenated value. The result could be either `don't panic', or `panic panic'. The precedence of concatenation, when mixed with other operators, is often counter-intuitive. Consider this example: $ awk 'BEGIN { print -12 " " -24 }' -| -12-24 This "obviously" is concatenating -12, a space, and -24. But where did the space disappear to? The answer lies in the combination of operator precedences and `awk''s automatic conversion rules. To get the desired result, write the program in the following manner: $ awk 'BEGIN { print -12 " " (-24) }' -| -12 -24 This forces `awk' to treat the `-' on the `-24' as unary. Otherwise, it's parsed as follows: -12 (`" "' - 24) => -12 (0 - 24) => -12 (-24) => -12-24 As mentioned earlier, when doing concatenation, _parenthesize_. Otherwise, you're never quite sure what you'll get. ---------- Footnotes ---------- (1) It happens that `gawk' and `mawk' "get it right," but you should not rely on this.  File: gawk.info, Node: Assignment Ops, Next: Increment Ops, Prev: Concatenation, Up: Expressions 5.7 Assignment Expressions ========================== An "assignment" is an expression that stores a (usually different) value into a variable. For example, let's assign the value one to the variable `z': z = 1 After this expression is executed, the variable `z' has the value one. Whatever old value `z' had before the assignment is forgotten. Assignments can also store string values. For example, the following stores the value `"this food is good"' in the variable `message': thing = "food" predicate = "good" message = "this " thing " is " predicate This also illustrates string concatenation. The `=' sign is called an "assignment operator". It is the simplest assignment operator because the value of the righthand operand is stored unchanged. Most operators (addition, concatenation, and so on) have no effect except to compute a value. If the value isn't used, there's no reason to use the operator. An assignment operator is different; it does produce a value, but even if you ignore it, the assignment still makes itself felt through the alteration of the variable. We call this a "side effect". The lefthand operand of an assignment need not be a variable (*note Variables::); it can also be a field (*note Changing Fields::) or an array element (*note Arrays::). These are all called "lvalues", which means they can appear on the lefthand side of an assignment operator. The righthand operand may be any expression; it produces the new value that the assignment stores in the specified variable, field, or array element. (Such values are called "rvalues".) It is important to note that variables do _not_ have permanent types. A variable's type is simply the type of whatever value it happens to hold at the moment. In the following program fragment, the variable `foo' has a numeric value at first, and a string value later on: foo = 1 print foo foo = "bar" print foo When the second assignment gives `foo' a string value, the fact that it previously had a numeric value is forgotten. String values that do not begin with a digit have a numeric value of zero. After executing the following code, the value of `foo' is five: foo = "a string" foo = foo + 5 NOTE: Using a variable as a number and then later as a string can be confusing and is poor programming style. The previous two examples illustrate how `awk' works, _not_ how you should write your programs! An assignment is an expression, so it has a value--the same value that is assigned. Thus, `z = 1' is an expression with the value one. One consequence of this is that you can write multiple assignments together, such as: x = y = z = 5 This example stores the value five in all three variables (`x', `y', and `z'). It does so because the value of `z = 5', which is five, is stored into `y' and then the value of `y = z = 5', which is five, is stored into `x'. Assignments may be used anywhere an expression is called for. For example, it is valid to write `x != (y = 1)' to set `y' to one, and then test whether `x' equals one. But this style tends to make programs hard to read; such nesting of assignments should be avoided, except perhaps in a one-shot program. Aside from `=', there are several other assignment operators that do arithmetic with the old value of the variable. For example, the operator `+=' computes a new value by adding the righthand value to the old value of the variable. Thus, the following assignment adds five to the value of `foo': foo += 5 This is equivalent to the following: foo = foo + 5 Use whichever makes the meaning of your program clearer. There are situations where using `+=' (or any assignment operator) is _not_ the same as simply repeating the lefthand operand in the righthand expression. For example: # Thanks to Pat Rankin for this example BEGIN { foo[rand()] += 5 for (x in foo) print x, foo[x] bar[rand()] = bar[rand()] + 5 for (x in bar) print x, bar[x] } The indices of `bar' are practically guaranteed to be different, because `rand' returns different values each time it is called. (Arrays and the `rand' function haven't been covered yet. *Note Arrays::, and see *note Numeric Functions::, for more information). This example illustrates an important fact about assignment operators: the lefthand expression is only evaluated _once_. It is up to the implementation as to which expression is evaluated first, the lefthand or the righthand. Consider this example: i = 1 a[i += 2] = i + 1 The value of `a[3]' could be either two or four. *note table-assign-ops:: lists the arithmetic assignment operators. In each case, the righthand operand is an expression whose value is converted to a number. Operator Effect -------------------------------------------------------------------------- LVALUE `+=' INCREMENT Adds INCREMENT to the value of LVALUE. LVALUE `-=' DECREMENT Subtracts DECREMENT from the value of LVALUE. LVALUE `*=' Multiplies the value of LVALUE by COEFFICIENT. COEFFICIENT LVALUE `/=' DIVISOR Divides the value of LVALUE by DIVISOR. LVALUE `%=' MODULUS Sets LVALUE to its remainder by MODULUS. LVALUE `^=' POWER LVALUE `**=' POWER Raises LVALUE to the power POWER. Table 5.2: Arithmetic Assignment Operators NOTE: Only the `^=' operator is specified by POSIX. For maximum portability, do not use the `**=' operator. Advanced Notes: Syntactic Ambiguities Between `/=' and Regular Expressions -------------------------------------------------------------------------- There is a syntactic ambiguity between the `/=' assignment operator and regexp constants whose first character is an `='. (d.c.) This is most notable in commercial `awk' versions. For example: $ awk /==/ /dev/null error--> awk: syntax error at source line 1 error--> context is error--> >>> /= <<< error--> awk: bailing out at source line 1 A workaround is: awk '/[=]=/' /dev/null `gawk' does not have this problem, nor do the other freely available versions described in *note Other Versions::.  File: gawk.info, Node: Increment Ops, Next: Truth Values, Prev: Assignment Ops, Up: Expressions 5.8 Increment and Decrement Operators ===================================== "Increment" and "decrement operators" increase or decrease the value of a variable by one. An assignment operator can do the same thing, so the increment operators add no power to the `awk' language; however, they are convenient abbreviations for very common operations. The operator used for adding one is written `++'. It can be used to increment a variable either before or after taking its value. To pre-increment a variable `v', write `++v'. This adds one to the value of `v'--that new value is also the value of the expression. (The assignment expression `v += 1' is completely equivalent.) Writing the `++' after the variable specifies post-increment. This increments the variable value just the same; the difference is that the value of the increment expression itself is the variable's _old_ value. Thus, if `foo' has the value four, then the expression `foo++' has the value four, but it changes the value of `foo' to five. In other words, the operator returns the old value of the variable, but with the side effect of incrementing it. The post-increment `foo++' is nearly the same as writing `(foo += 1) - 1'. It is not perfectly equivalent because all numbers in `awk' are floating-point--in floating-point, `foo + 1 - 1' does not necessarily equal `foo'. But the difference is minute as long as you stick to numbers that are fairly small (less than 10e12). Fields and array elements are incremented just like variables. (Use `$(i++)' when you want to do a field reference and a variable increment at the same time. The parentheses are necessary because of the precedence of the field reference operator `$'.) The decrement operator `--' works just like `++', except that it subtracts one instead of adding it. As with `++', it can be used before the lvalue to pre-decrement or after it to post-decrement. Following is a summary of increment and decrement expressions: `++LVALUE' This expression increments LVALUE, and the new value becomes the value of the expression. `LVALUE++' This expression increments LVALUE, but the value of the expression is the _old_ value of LVALUE. `--LVALUE' This expression is like `++LVALUE', but instead of adding, it subtracts. It decrements LVALUE and delivers the value that is the result. `LVALUE--' This expression is like `LVALUE++', but instead of adding, it subtracts. It decrements LVALUE. The value of the expression is the _old_ value of LVALUE. Advanced Notes: Operator Evaluation Order ----------------------------------------- Doctor, doctor! It hurts when I do this! So don't do that! Groucho Marx What happens for something like the following? b = 6 print b += b++ Or something even stranger? b = 6 b += ++b + b++ print b In other words, when do the various side effects prescribed by the postfix operators (`b++') take effect? When side effects happen is "implementation defined". In other words, it is up to the particular version of `awk'. The result for the first example may be 12 or 13, and for the second, it may be 22 or 23. In short, doing things like this is not recommended and definitely not anything that you can rely upon for portability. You should avoid such things in your own programs.  File: gawk.info, Node: Truth Values, Next: Typing and Comparison, Prev: Increment Ops, Up: Expressions 5.9 True and False in `awk' =========================== Many programming languages have a special representation for the concepts of "true" and "false." Such languages usually use the special constants `true' and `false', or perhaps their uppercase equivalents. However, `awk' is different. It borrows a very simple concept of true and false from C. In `awk', any nonzero numeric value _or_ any nonempty string value is true. Any other value (zero or the null string `""') is false. The following program prints `A strange truth value' three times: BEGIN { if (3.1415927) print "A strange truth value" if ("Four Score And Seven Years Ago") print "A strange truth value" if (j = 57) print "A strange truth value" } There is a surprising consequence of the "nonzero or non-null" rule: the string constant `"0"' is actually true, because it is non-null. (d.c.)  File: gawk.info, Node: Typing and Comparison, Next: Boolean Ops, Prev: Truth Values, Up: Expressions 5.10 Variable Typing and Comparison Expressions =============================================== The Guide is definitive. Reality is frequently inaccurate. The Hitchhiker's Guide to the Galaxy Unlike other programming languages, `awk' variables do not have a fixed type. Instead, they can be either a number or a string, depending upon the value that is assigned to them. We look now at how variables are typed, and how `awk' compares variables. * Menu: * Variable Typing:: String type versus numeric type. * Comparison Operators:: The comparison operators.  File: gawk.info, Node: Variable Typing, Next: Comparison Operators, Up: Typing and Comparison 5.10.1 String Type Versus Numeric Type -------------------------------------- The 1992 POSIX standard introduced the concept of a "numeric string", which is simply a string that looks like a number--for example, `" +2"'. This concept is used for determining the type of a variable. The type of the variable is important because the types of two variables determine how they are compared. In `gawk', variable typing follows these rules: * A numeric constant or the result of a numeric operation has the NUMERIC attribute. * A string constant or the result of a string operation has the STRING attribute. * Fields, `getline' input, `FILENAME', `ARGV' elements, `ENVIRON' elements, and the elements of an array created by `split' that are numeric strings have the STRNUM attribute. Otherwise, they have the STRING attribute. Uninitialized variables also have the STRNUM attribute. * Attributes propagate across assignments but are not changed by any use. The last rule is particularly important. In the following program, `a' has numeric type, even though it is later used in a string operation: BEGIN { a = 12.345 b = a " is a cute number" print b } When two operands are compared, either string comparison or numeric comparison may be used. This depends upon the attributes of the operands, according to the following symmetric matrix: +--------------------------------------------- | STRING NUMERIC STRNUM -------+--------------------------------------------- | STRING | string string string | NUMERIC | string numeric numeric | STRNUM | string numeric numeric -------+--------------------------------------------- The basic idea is that user input that looks numeric--and _only_ user input--should be treated as numeric, even though it is actually made of characters and is therefore also a string. Thus, for example, the string constant `" +3.14"', when it appears in program source code, is a string--even though it looks numeric--and is _never_ treated as number for comparison purposes. In short, when one operand is a "pure" string, such as a string constant, then a string comparison is performed. Otherwise, a numeric comparison is performed.(1) This point bears additional emphasis: All user input is made of characters, and so is first and foremost of STRING type; input strings that look numeric are additionally given the STRNUM attribute. Thus, the six-character input string ` +3.14' receives the STRNUM attribute. In contrast, the eight-character literal `" +3.14"' appearing in program text is a string constant. The following examples print `1' when the comparison between the two different constants is true, `0' otherwise: $ echo ' +3.14' | gawk '{ print $0 == " +3.14" }' True -| 1 $ echo ' +3.14' | gawk '{ print $0 == "+3.14" }' False -| 0 $ echo ' +3.14' | gawk '{ print $0 == "3.14" }' False -| 0 $ echo ' +3.14' | gawk '{ print $0 == 3.14 }' True -| 1 $ echo ' +3.14' | gawk '{ print $1 == " +3.14" }' False -| 0 $ echo ' +3.14' | gawk '{ print $1 == "+3.14" }' True -| 1 $ echo ' +3.14' | gawk '{ print $1 == "3.14" }' False -| 0 $ echo ' +3.14' | gawk '{ print $1 == 3.14 }' True -| 1 ---------- Footnotes ---------- (1) The POSIX standard has been revised. The revised standard's rules for typing and comparison are the same as just described for `gawk'.  File: gawk.info, Node: Comparison Operators, Prev: Variable Typing, Up: Typing and Comparison 5.10.2 Comparison Operators --------------------------- "Comparison expressions" compare strings or numbers for relationships such as equality. They are written using "relational operators", which are a superset of those in C. *note table-relational-ops:: describes them. Expression Result -------------------------------------------------------------------------- X `<' Y True if X is less than Y. X `<=' Y True if X is less than or equal to Y. X `>' Y True if X is greater than Y. X `>=' Y True if X is greater than or equal to Y. X `==' Y True if X is equal to Y. X `!=' Y True if X is not equal to Y. X `~' Y True if the string X matches the regexp denoted by Y. X `!~' Y True if the string X does not match the regexp denoted by Y. SUBSCRIPT `in' True if the array ARRAY has an element with the ARRAY subscript SUBSCRIPT. Table 5.3: Relational Operators Comparison expressions have the value one if true and zero if false. When comparing operands of mixed types, numeric operands are converted to strings using the value of `CONVFMT' (*note Conversion::). Strings are compared by comparing the first character of each, then the second character of each, and so on. Thus, `"10"' is less than `"9"'. If there are two strings where one is a prefix of the other, the shorter string is less than the longer one. Thus, `"abc"' is less than `"abcd"'. It is very easy to accidentally mistype the `==' operator and leave off one of the `=' characters. The result is still valid `awk' code, but the program does not do what is intended: if (a = b) # oops! should be a == b ... else ... Unless `b' happens to be zero or the null string, the `if' part of the test always succeeds. Because the operators are so similar, this kind of error is very difficult to spot when scanning the source code. The following table of expressions illustrates the kind of comparison `gawk' performs, as well as what the result of the comparison is: `1.5 <= 2.0' numeric comparison (true) `"abc" >= "xyz"' string comparison (false) `1.5 != " +2"' string comparison (true) `"1e2" < "3"' string comparison (true) `a = 2; b = "2"' `a == b' string comparison (true) `a = 2; b = " +2"' `a == b' string comparison (false) In the next example: $ echo 1e2 3 | awk '{ print ($1 < $2) ? "true" : "false" }' -| false the result is `false' because both `$1' and `$2' are user input. They are numeric strings--therefore both have the STRNUM attribute, dictating a numeric comparison. The purpose of the comparison rules and the use of numeric strings is to attempt to produce the behavior that is "least surprising," while still "doing the right thing." String comparisons and regular expression comparisons are very different. For example: x == "foo" has the value one, or is true if the variable `x' is precisely `foo'. By contrast: x ~ /foo/ has the value one if `x' contains `foo', such as `"Oh, what a fool am I!"'. The righthand operand of the `~' and `!~' operators may be either a regexp constant (`/.../') or an ordinary expression. In the latter case, the value of the expression as a string is used as a dynamic regexp (*note Regexp Usage::; also *note Computed Regexps::). In modern implementations of `awk', a constant regular expression in slashes by itself is also an expression. The regexp `/REGEXP/' is an abbreviation for the following comparison expression: $0 ~ /REGEXP/ One special place where `/foo/' is _not_ an abbreviation for `$0 ~ /foo/' is when it is the righthand operand of `~' or `!~'. *Note Using Constant Regexps::, where this is discussed in more detail.  File: gawk.info, Node: Boolean Ops, Next: Conditional Exp, Prev: Typing and Comparison, Up: Expressions 5.11 Boolean Expressions ======================== A "Boolean expression" is a combination of comparison expressions or matching expressions, using the Boolean operators "or" (`||'), "and" (`&&'), and "not" (`!'), along with parentheses to control nesting. The truth value of the Boolean expression is computed by combining the truth values of the component expressions. Boolean expressions are also referred to as "logical expressions". The terms are equivalent. Boolean expressions can be used wherever comparison and matching expressions can be used. They can be used in `if', `while', `do', and `for' statements (*note Statements::). They have numeric values (one if true, zero if false) that come into play if the result of the Boolean expression is stored in a variable or used in arithmetic. In addition, every Boolean expression is also a valid pattern, so you can use one as a pattern to control the execution of rules. The Boolean operators are: `BOOLEAN1 && BOOLEAN2' True if both BOOLEAN1 and BOOLEAN2 are true. For example, the following statement prints the current input record if it contains both `2400' and `foo': if ($0 ~ /2400/ && $0 ~ /foo/) print The subexpression BOOLEAN2 is evaluated only if BOOLEAN1 is true. This can make a difference when BOOLEAN2 contains expressions that have side effects. In the case of `$0 ~ /foo/ && ($2 == bar++)', the variable `bar' is not incremented if there is no substring `foo' in the record. `BOOLEAN1 || BOOLEAN2' True if at least one of BOOLEAN1 or BOOLEAN2 is true. For example, the following statement prints all records in the input that contain _either_ `2400' or `foo' or both: if ($0 ~ /2400/ || $0 ~ /foo/) print The subexpression BOOLEAN2 is evaluated only if BOOLEAN1 is false. This can make a difference when BOOLEAN2 contains expressions that have side effects. `! BOOLEAN' True if BOOLEAN is false. For example, the following program prints `no home!' in the unusual event that the `HOME' environment variable is not defined: BEGIN { if (! ("HOME" in ENVIRON)) print "no home!" } (The `in' operator is described in *note Reference to Elements::.) The `&&' and `||' operators are called "short-circuit" operators because of the way they work. Evaluation of the full expression is "short-circuited" if the result can be determined part way through its evaluation. Statements that use `&&' or `||' can be continued simply by putting a newline after them. But you cannot put a newline in front of either of these operators without using backslash continuation (*note Statements/Lines::). The actual value of an expression using the `!' operator is either one or zero, depending upon the truth value of the expression it is applied to. The `!' operator is often useful for changing the sense of a flag variable from false to true and back again. For example, the following program is one way to print lines in between special bracketing lines: $1 == "START" { interested = ! interested; next } interested == 1 { print } $1 == "END" { interested = ! interested; next } The variable `interested', as with all `awk' variables, starts out initialized to zero, which is also false. When a line is seen whose first field is `START', the value of `interested' is toggled to true, using `!'. The next rule prints lines as long as `interested' is true. When a line is seen whose first field is `END', `interested' is toggled back to false.(1) NOTE: The `next' statement is discussed in *note Next Statement::. `next' tells `awk' to skip the rest of the rules, get the next record, and start processing the rules over again at the top. The reason it's there is to avoid printing the bracketing `START' and `END' lines. ---------- Footnotes ---------- (1) This program has a bug; it prints lines starting with `END'. How would you fix it?  File: gawk.info, Node: Conditional Exp, Next: Function Calls, Prev: Boolean Ops, Up: Expressions 5.12 Conditional Expressions ============================ A "conditional expression" is a special kind of expression that has three operands. It allows you to use one expression's value to select one of two other expressions. The conditional expression is the same as in the C language, as shown here: SELECTOR ? IF-TRUE-EXP : IF-FALSE-EXP There are three subexpressions. The first, SELECTOR, is always computed first. If it is "true" (not zero or not null), then IF-TRUE-EXP is computed next and its value becomes the value of the whole expression. Otherwise, IF-FALSE-EXP is computed next and its value becomes the value of the whole expression. For example, the following expression produces the absolute value of `x': x >= 0 ? x : -x Each time the conditional expression is computed, only one of IF-TRUE-EXP and IF-FALSE-EXP is used; the other is ignored. This is important when the expressions have side effects. For example, this conditional expression examines element `i' of either array `a' or array `b', and increments `i': x == y ? a[i++] : b[i++] This is guaranteed to increment `i' exactly once, because each time only one of the two increment expressions is executed and the other is not. *Note Arrays::, for more information about arrays. As a minor `gawk' extension, a statement that uses `?:' can be continued simply by putting a newline after either character. However, putting a newline in front of either character does not work without using backslash continuation (*note Statements/Lines::). If `--posix' is specified (*note Options::), then this extension is disabled.  File: gawk.info, Node: Function Calls, Next: Precedence, Prev: Conditional Exp, Up: Expressions 5.13 Function Calls =================== A "function" is a name for a particular calculation. This enables you to ask for it by name at any point in the program. For example, the function `sqrt' computes the square root of a number. A fixed set of functions are "built-in", which means they are available in every `awk' program. The `sqrt' function is one of these. *Note Built-in::, for a list of built-in functions and their descriptions. In addition, you can define functions for use in your program. *Note User-defined::, for instructions on how to do this. The way to use a function is with a "function call" expression, which consists of the function name followed immediately by a list of "arguments" in parentheses. The arguments are expressions that provide the raw materials for the function's calculations. When there is more than one argument, they are separated by commas. If there are no arguments, just write `()' after the function name. The following examples show function calls with and without arguments: sqrt(x^2 + y^2) one argument atan2(y, x) two arguments rand() no arguments *Caution:* Do not put any space between the function name and the open-parenthesis! A user-defined function name looks just like the name of a variable--a space would make the expression look like concatenation of a variable with an expression inside parentheses. With built-in functions, space before the parenthesis is harmless, but it is best not to get into the habit of using space to avoid mistakes with user-defined functions. Each function expects a particular number of arguments. For example, the `sqrt' function must be called with a single argument, the number of which to take the square root: sqrt(ARGUMENT) Some of the built-in functions have one or more optional arguments. If those arguments are not supplied, the functions use a reasonable default value. *Note Built-in::, for full details. If arguments are omitted in calls to user-defined functions, then those arguments are treated as local variables and initialized to the empty string (*note User-defined::). Like every other expression, the function call has a value, which is computed by the function based on the arguments you give it. In this example, the value of `sqrt(ARGUMENT)' is the square root of ARGUMENT. The following program reads numbers, one number per line, and prints the square root of each one: $ awk '{ print "The square root of", $1, "is", sqrt($1) }' 1 -| The square root of 1 is 1 3 -| The square root of 3 is 1.73205 5 -| The square root of 5 is 2.23607 Ctrl-d A function can also have side effects, such as assigning values to certain variables or doing I/O. This program shows how the `match' function (*note String Functions::) changes the variables `RSTART' and `RLENGTH': { if (match($1, $2)) print RSTART, RLENGTH else print "no match" } Here is a sample run: $ awk -f matchit.awk aaccdd c+ -| 3 2 foo bar -| no match abcdefg e -| 5 1  File: gawk.info, Node: Precedence, Prev: Function Calls, Up: Expressions 5.14 Operator Precedence (How Operators Nest) ============================================= "Operator precedence" determines how operators are grouped when different operators appear close by in one expression. For example, `*' has higher precedence than `+'; thus, `a + b * c' means to multiply `b' and `c', and then add `a' to the product (i.e., `a + (b * c)'). The normal precedence of the operators can be overruled by using parentheses. Think of the precedence rules as saying where the parentheses are assumed to be. In fact, it is wise to always use parentheses whenever there is an unusual combination of operators, because other people who read the program may not remember what the precedence is in this case. Even experienced programmers occasionally forget the exact rules, which leads to mistakes. Explicit parentheses help prevent any such mistakes. When operators of equal precedence are used together, the leftmost operator groups first, except for the assignment, conditional, and exponentiation operators, which group in the opposite order. Thus, `a - b + c' groups as `(a - b) + c' and `a = b = c' groups as `a = (b = c)'. Normally the precedence of prefix unary operators does not matter, because there is only one way to interpret them: innermost first. Thus, `$++i' means `$(++i)' and `++$x' means `++($x)'. However, when another operator follows the operand, then the precedence of the unary operators can matter. `$x^2' means `($x)^2', but `-x^2' means `-(x^2)', because `-' has lower precedence than `^', whereas `$' has higher precedence. Also, operators cannot be combined in a way that violates the precedence rules; for example, `$$0++--' is not a valid expression because the first `$' has higher precedence than the `++'; to avoid the problem the expression can be rewritten as `$($0++)--'. This table presents `awk''s operators, in order of highest to lowest precedence: `(...)' Grouping. `$' Field. `++ --' Increment, decrement. `^ **' Exponentiation. These operators group right-to-left. `+ - !' Unary plus, minus, logical "not." `* / %' Multiplication, division, remainder. `+ -' Addition, subtraction. `String Concatenation' No special symbol is used to indicate concatenation. The operands are simply written side by side (*note Concatenation::). `< <= == !=' `> >= >> | |&' Relational and redirection. The relational operators and the redirections have the same precedence level. Characters such as `>' serve both as relationals and as redirections; the context distinguishes between the two meanings. Note that the I/O redirection operators in `print' and `printf' statements belong to the statement level, not to expressions. The redirection does not produce an expression that could be the operand of another operator. As a result, it does not make sense to use a redirection operator near another operator of lower precedence without parentheses. Such combinations (for example, `print foo > a ? b : c'), result in syntax errors. The correct way to write this statement is `print foo > (a ? b : c)'. `~ !~' Matching, nonmatching. `in' Array membership. `&&' Logical "and". `||' Logical "or". `?:' Conditional. This operator groups right-to-left. `= += -= *=' `/= %= ^= **=' Assignment. These operators group right to left. NOTE: The `|&', `**', and `**=' operators are not specified by POSIX. For maximum portability, do not use them.  File: gawk.info, Node: Patterns and Actions, Next: Arrays, Prev: Expressions, Up: Top 6 Patterns, Actions, and Variables ********************************** As you have already seen, each `awk' statement consists of a pattern with an associated action. This major node describes how you build patterns and actions, what kinds of things you can do within actions, and `awk''s built-in variables. The pattern-action rules and the statements available for use within actions form the core of `awk' programming. In a sense, everything covered up to here has been the foundation that programs are built on top of. Now it's time to start building something useful. * Menu: * Pattern Overview:: What goes into a pattern. * Using Shell Variables:: How to use shell variables with `awk'. * Action Overview:: What goes into an action. * Statements:: Describes the various control statements in detail. * Built-in Variables:: Summarizes the built-in variables.  File: gawk.info, Node: Pattern Overview, Next: Using Shell Variables, Up: Patterns and Actions 6.1 Pattern Elements ==================== * Menu: * Regexp Patterns:: Using regexps as patterns. * Expression Patterns:: Any expression can be used as a pattern. * Ranges:: Pairs of patterns specify record ranges. * BEGIN/END:: Specifying initialization and cleanup rules. * Empty:: The empty pattern, which matches every record. Patterns in `awk' control the execution of rules--a rule is executed when its pattern matches the current input record. The following is a summary of the types of `awk' patterns: `/REGULAR EXPRESSION/' A regular expression. It matches when the text of the input record fits the regular expression. (*Note Regexp::.) `EXPRESSION' A single expression. It matches when its value is nonzero (if a number) or non-null (if a string). (*Note Expression Patterns::.) `PAT1, PAT2' A pair of patterns separated by a comma, specifying a range of records. The range includes both the initial record that matches PAT1 and the final record that matches PAT2. (*Note Ranges::.) `BEGIN' `END' Special patterns for you to supply startup or cleanup actions for your `awk' program. (*Note BEGIN/END::.) `EMPTY' The empty pattern matches every input record. (*Note Empty::.)  File: gawk.info, Node: Regexp Patterns, Next: Expression Patterns, Up: Pattern Overview 6.1.1 Regular Expressions as Patterns ------------------------------------- Regular expressions are one of the first kinds of patterns presented in this book. This kind of pattern is simply a regexp constant in the pattern part of a rule. Its meaning is `$0 ~ /PATTERN/'. The pattern matches when the input record matches the regexp. For example: /foo|bar|baz/ { buzzwords++ } END { print buzzwords, "buzzwords seen" }  File: gawk.info, Node: Expression Patterns, Next: Ranges, Prev: Regexp Patterns, Up: Pattern Overview 6.1.2 Expressions as Patterns ----------------------------- Any `awk' expression is valid as an `awk' pattern. The pattern matches if the expression's value is nonzero (if a number) or non-null (if a string). The expression is reevaluated each time the rule is tested against a new input record. If the expression uses fields such as `$1', the value depends directly on the new input record's text; otherwise, it depends on only what has happened so far in the execution of the `awk' program. Comparison expressions, using the comparison operators described in *note Typing and Comparison::, are a very common kind of pattern. Regexp matching and nonmatching are also very common expressions. The left operand of the `~' and `!~' operators is a string. The right operand is either a constant regular expression enclosed in slashes (`/REGEXP/'), or any expression whose string value is used as a dynamic regular expression (*note Computed Regexps::). The following example prints the second field of each input record whose first field is precisely `foo': $ awk '$1 == "foo" { print $2 }' BBS-list (There is no output, because there is no BBS site with the exact name `foo'.) Contrast this with the following regular expression match, which accepts any record with a first field that contains `foo': $ awk '$1 ~ /foo/ { print $2 }' BBS-list -| 555-1234 -| 555-6699 -| 555-6480 -| 555-2127 A regexp constant as a pattern is also a special case of an expression pattern. The expression `/foo/' has the value one if `foo' appears in the current input record. Thus, as a pattern, `/foo/' matches any record containing `foo'. Boolean expressions are also commonly used as patterns. Whether the pattern matches an input record depends on whether its subexpressions match. For example, the following command prints all the records in `BBS-list' that contain both `2400' and `foo': $ awk '/2400/ && /foo/' BBS-list -| fooey 555-1234 2400/1200/300 B The following command prints all records in `BBS-list' that contain _either_ `2400' or `foo' (or both, of course): $ awk '/2400/ || /foo/' BBS-list -| alpo-net 555-3412 2400/1200/300 A -| bites 555-1675 2400/1200/300 A -| fooey 555-1234 2400/1200/300 B -| foot 555-6699 1200/300 B -| macfoo 555-6480 1200/300 A -| sdace 555-3430 2400/1200/300 A -| sabafoo 555-2127 1200/300 C The following command prints all records in `BBS-list' that do _not_ contain the string `foo': $ awk '! /foo/' BBS-list -| aardvark 555-5553 1200/300 B -| alpo-net 555-3412 2400/1200/300 A -| barfly 555-7685 1200/300 A -| bites 555-1675 2400/1200/300 A -| camelot 555-0542 300 C -| core 555-2912 1200/300 C -| sdace 555-3430 2400/1200/300 A The subexpressions of a Boolean operator in a pattern can be constant regular expressions, comparisons, or any other `awk' expressions. Range patterns are not expressions, so they cannot appear inside Boolean patterns. Likewise, the special patterns `BEGIN' and `END', which never match any input record, are not expressions and cannot appear inside Boolean patterns.  File: gawk.info, Node: Ranges, Next: BEGIN/END, Prev: Expression Patterns, Up: Pattern Overview 6.1.3 Specifying Record Ranges with Patterns -------------------------------------------- A "range pattern" is made of two patterns separated by a comma, in the form `BEGPAT, ENDPAT'. It is used to match ranges of consecutive input records. The first pattern, BEGPAT, controls where the range begins, while ENDPAT controls where the pattern ends. For example, the following: awk '$1 == "on", $1 == "off"' myfile prints every record in `myfile' between `on'/`off' pairs, inclusive. A range pattern starts out by matching BEGPAT against every input record. When a record matches BEGPAT, the range pattern is "turned on" and the range pattern matches this record as well. As long as the range pattern stays turned on, it automatically matches every input record read. The range pattern also matches ENDPAT against every input record; when this succeeds, the range pattern is turned off again for the following record. Then the range pattern goes back to checking BEGPAT against each record. The record that turns on the range pattern and the one that turns it off both match the range pattern. If you don't want to operate on these records, you can write `if' statements in the rule's action to distinguish them from the records you are interested in. It is possible for a pattern to be turned on and off by the same record. If the record satisfies both conditions, then the action is executed for just that record. For example, suppose there is text between two identical markers (e.g., the `%' symbol), each on its own line, that should be ignored. A first attempt would be to combine a range pattern that describes the delimited text with the `next' statement (not discussed yet, *note Next Statement::). This causes `awk' to skip any further processing of the current record and start over again with the next input record. Such a program looks like this: /^%$/,/^%$/ { next } { print } This program fails because the range pattern is both turned on and turned off by the first line, which just has a `%' on it. To accomplish this task, write the program in the following manner, using a flag: /^%$/ { skip = ! skip; next } skip == 1 { next } # skip lines with `skip' set In a range pattern, the comma (`,') has the lowest precedence of all the operators (i.e., it is evaluated last). Thus, the following program attempts to combine a range pattern with another, simpler test: echo Yes | awk '/1/,/2/ || /Yes/' The intent of this program is `(/1/,/2/) || /Yes/'. However, `awk' interprets this as `/1/, (/2/ || /Yes/)'. This cannot be changed or worked around; range patterns do not combine with other patterns: $ echo Yes | gawk '(/1/,/2/) || /Yes/' error--> gawk: cmd. line:1: (/1/,/2/) || /Yes/ error--> gawk: cmd. line:1: ^ parse error error--> gawk: cmd. line:2: (/1/,/2/) || /Yes/ error--> gawk: cmd. line:2: ^ unexpected newline  File: gawk.info, Node: BEGIN/END, Next: Empty, Prev: Ranges, Up: Pattern Overview 6.1.4 The `BEGIN' and `END' Special Patterns -------------------------------------------- All the patterns described so far are for matching input records. The `BEGIN' and `END' special patterns are different. They supply startup and cleanup actions for `awk' programs. `BEGIN' and `END' rules must have actions; there is no default action for these rules because there is no current record when they run. `BEGIN' and `END' rules are often referred to as "`BEGIN' and `END' blocks" by long-time `awk' programmers. * Menu: * Using BEGIN/END:: How and why to use BEGIN/END rules. * I/O And BEGIN/END:: I/O issues in BEGIN/END rules.  File: gawk.info, Node: Using BEGIN/END, Next: I/O And BEGIN/END, Up: BEGIN/END 6.1.4.1 Startup and Cleanup Actions ................................... A `BEGIN' rule is executed once only, before the first input record is read. Likewise, an `END' rule is executed once only, after all the input is read. For example: $ awk ' > BEGIN { print "Analysis of \"foo\"" } > /foo/ { ++n } > END { print "\"foo\" appears", n, "times." }' BBS-list -| Analysis of "foo" -| "foo" appears 4 times. This program finds the number of records in the input file `BBS-list' that contain the string `foo'. The `BEGIN' rule prints a title for the report. There is no need to use the `BEGIN' rule to initialize the counter `n' to zero, since `awk' does this automatically (*note Variables::). The second rule increments the variable `n' every time a record containing the pattern `foo' is read. The `END' rule prints the value of `n' at the end of the run. The special patterns `BEGIN' and `END' cannot be used in ranges or with Boolean operators (indeed, they cannot be used with any operators). An `awk' program may have multiple `BEGIN' and/or `END' rules. They are executed in the order in which they appear: all the `BEGIN' rules at startup and all the `END' rules at termination. `BEGIN' and `END' rules may be intermixed with other rules. This feature was added in the 1987 version of `awk' and is included in the POSIX standard. The original (1978) version of `awk' required the `BEGIN' rule to be placed at the beginning of the program, the `END' rule to be placed at the end, and only allowed one of each. This is no longer required, but it is a good idea to follow this template in terms of program organization and readability. Multiple `BEGIN' and `END' rules are useful for writing library functions, because each library file can have its own `BEGIN' and/or `END' rule to do its own initialization and/or cleanup. The order in which library functions are named on the command line controls the order in which their `BEGIN' and `END' rules are executed. Therefore, you have to be careful when writing such rules in library files so that the order in which they are executed doesn't matter. *Note Options::, for more information on using library functions. *Note Library Functions::, for a number of useful library functions. If an `awk' program has only a `BEGIN' rule and no other rules, then the program exits after the `BEGIN' rule is run.(1) However, if an `END' rule exists, then the input is read, even if there are no other rules in the program. This is necessary in case the `END' rule checks the `FNR' and `NR' variables. ---------- Footnotes ---------- (1) The original version of `awk' used to keep reading and ignoring input until the end of the file was seen.  File: gawk.info, Node: I/O And BEGIN/END, Prev: Using BEGIN/END, Up: BEGIN/END 6.1.4.2 Input/Output from `BEGIN' and `END' Rules ................................................. There are several (sometimes subtle) points to remember when doing I/O from a `BEGIN' or `END' rule. The first has to do with the value of `$0' in a `BEGIN' rule. Because `BEGIN' rules are executed before any input is read, there simply is no input record, and therefore no fields, when executing `BEGIN' rules. References to `$0' and the fields yield a null string or zero, depending upon the context. One way to give `$0' a real value is to execute a `getline' command without a variable (*note Getline::). Another way is simply to assign a value to `$0'. The second point is similar to the first but from the other direction. Traditionally, due largely to implementation issues, `$0' and `NF' were _undefined_ inside an `END' rule. The POSIX standard specifies that `NF' is available in an `END' rule. It contains the number of fields from the last input record. Most probably due to an oversight, the standard does not say that `$0' is also preserved, although logically one would think that it should be. In fact, `gawk' does preserve the value of `$0' for use in `END' rules. Be aware, however, that Unix `awk', and possibly other implementations, do not. The third point follows from the first two. The meaning of `print' inside a `BEGIN' or `END' rule is the same as always: `print $0'. If `$0' is the null string, then this prints an empty line. Many long time `awk' programmers use an unadorned `print' in `BEGIN' and `END' rules, to mean `print ""', relying on `$0' being null. Although one might generally get away with this in `BEGIN' rules, it is a very bad idea in `END' rules, at least in `gawk'. It is also poor style, since if an empty line is needed in the output, the program should print one explicitly. Finally, the `next' and `nextfile' statements are not allowed in a `BEGIN' rule, because the implicit read-a-record-and-match-against-the-rules loop has not started yet. Similarly, those statements are not valid in an `END' rule, since all the input has been read. (*Note Next Statement::, and see *note Nextfile Statement::.)  File: gawk.info, Node: Empty, Prev: BEGIN/END, Up: Pattern Overview 6.1.5 The Empty Pattern ----------------------- An empty (i.e., nonexistent) pattern is considered to match _every_ input record. For example, the program: awk '{ print $1 }' BBS-list prints the first field of every record.  File: gawk.info, Node: Using Shell Variables, Next: Action Overview, Prev: Pattern Overview, Up: Patterns and Actions 6.2 Using Shell Variables in Programs ===================================== `awk' programs are often used as components in larger programs written in shell. For example, it is very common to use a shell variable to hold a pattern that the `awk' program searches for. There are two ways to get the value of the shell variable into the body of the `awk' program. The most common method is to use shell quoting to substitute the variable's value into the program inside the script. For example, in the following program: echo -n "Enter search pattern: " read pattern awk "/$pattern/ "'{ nmatches++ } END { print nmatches, "found" }' /path/to/data the `awk' program consists of two pieces of quoted text that are concatenated together to form the program. The first part is double-quoted, which allows substitution of the `pattern' variable inside the quotes. The second part is single-quoted. Variable substitution via quoting works, but can be potentially messy. It requires a good understanding of the shell's quoting rules (*note Quoting::), and it's often difficult to correctly match up the quotes when reading the program. A better method is to use `awk''s variable assignment feature (*note Assignment Options::) to assign the shell variable's value to an `awk' variable's value. Then use dynamic regexps to match the pattern (*note Computed Regexps::). The following shows how to redo the previous example using this technique: echo -n "Enter search pattern: " read pattern awk -v pat="$pattern" '$0 ~ pat { nmatches++ } END { print nmatches, "found" }' /path/to/data Now, the `awk' program is just one single-quoted string. The assignment `-v pat="$pattern"' still requires double quotes, in case there is whitespace in the value of `$pattern'. The `awk' variable `pat' could be named `pattern' too, but that would be more confusing. Using a variable also provides more flexibility, since the variable can be used anywhere inside the program--for printing, as an array subscript, or for any other use--without requiring the quoting tricks at every point in the program.  File: gawk.info, Node: Action Overview, Next: Statements, Prev: Using Shell Variables, Up: Patterns and Actions 6.3 Actions =========== An `awk' program or script consists of a series of rules and function definitions interspersed. (Functions are described later. *Note User-defined::.) A rule contains a pattern and an action, either of which (but not both) may be omitted. The purpose of the "action" is to tell `awk' what to do once a match for the pattern is found. Thus, in outline, an `awk' program generally looks like this: [PATTERN] [{ ACTION }] [PATTERN] [{ ACTION }] ... function NAME(ARGS) { ... } ... An action consists of one or more `awk' "statements", enclosed in curly braces (`{...}'). Each statement specifies one thing to do. The statements are separated by newlines or semicolons. The curly braces around an action must be used even if the action contains only one statement, or if it contains no statements at all. However, if you omit the action entirely, omit the curly braces as well. An omitted action is equivalent to `{ print $0 }': /foo/ { } match `foo', do nothing -- empty action /foo/ match `foo', print the record -- omitted action The following types of statements are supported in `awk': Expressions Call functions or assign values to variables (*note Expressions::). Executing this kind of statement simply computes the value of the expression. This is useful when the expression has side effects (*note Assignment Ops::). Control statements Specify the control flow of `awk' programs. The `awk' language gives you C-like constructs (`if', `for', `while', and `do') as well as a few special ones (*note Statements::). Compound statements Consist of one or more statements enclosed in curly braces. A compound statement is used in order to put several statements together in the body of an `if', `while', `do', or `for' statement. Input statements Use the `getline' command (*note Getline::). Also supplied in `awk' are the `next' statement (*note Next Statement::), and the `nextfile' statement (*note Nextfile Statement::). Output statements Such as `print' and `printf'. *Note Printing::. Deletion statements For deleting array elements. *Note Delete::.  File: gawk.info, Node: Statements, Next: Built-in Variables, Prev: Action Overview, Up: Patterns and Actions 6.4 Control Statements in Actions ================================= "Control statements", such as `if', `while', and so on, control the flow of execution in `awk' programs. Most of the control statements in `awk' are patterned on similar statements in C. All the control statements start with special keywords, such as `if' and `while', to distinguish them from simple expressions. Many control statements contain other statements. For example, the `if' statement contains another statement that may or may not be executed. The contained statement is called the "body". To include more than one statement in the body, group them into a single "compound statement" with curly braces, separating them with newlines or semicolons. * Menu: * If Statement:: Conditionally execute some `awk' statements. * While Statement:: Loop until some condition is satisfied. * Do Statement:: Do specified action while looping until some condition is satisfied. * For Statement:: Another looping statement, that provides initialization and increment clauses. * Switch Statement:: Switch/case evaluation for conditional execution of statements based on a value. * Break Statement:: Immediately exit the innermost enclosing loop. * Continue Statement:: Skip to the end of the innermost enclosing loop. * Next Statement:: Stop processing the current input record. * Nextfile Statement:: Stop processing the current file. * Exit Statement:: Stop execution of `awk'.  File: gawk.info, Node: If Statement, Next: While Statement, Up: Statements 6.4.1 The `if'-`else' Statement ------------------------------- The `if'-`else' statement is `awk''s decision-making statement. It looks like this: if (CONDITION) THEN-BODY [else ELSE-BODY] The CONDITION is an expression that controls what the rest of the statement does. If the CONDITION is true, THEN-BODY is executed; otherwise, ELSE-BODY is executed. The `else' part of the statement is optional. The condition is considered false if its value is zero or the null string; otherwise, the condition is true. Refer to the following: if (x % 2 == 0) print "x is even" else print "x is odd" In this example, if the expression `x % 2 == 0' is true (that is, if the value of `x' is evenly divisible by two), then the first `print' statement is executed; otherwise, the second `print' statement is executed. If the `else' keyword appears on the same line as THEN-BODY and THEN-BODY is not a compound statement (i.e., not surrounded by curly braces), then a semicolon must separate THEN-BODY from the `else'. To illustrate this, the previous example can be rewritten as: if (x % 2 == 0) print "x is even"; else print "x is odd" If the `;' is left out, `awk' can't interpret the statement and it produces a syntax error. Don't actually write programs this way, because a human reader might fail to see the `else' if it is not the first thing on its line.  File: gawk.info, Node: While Statement, Next: Do Statement, Prev: If Statement, Up: Statements 6.4.2 The `while' Statement --------------------------- In programming, a "loop" is a part of a program that can be executed two or more times in succession. The `while' statement is the simplest looping statement in `awk'. It repeatedly executes a statement as long as a condition is true. For example: while (CONDITION) BODY BODY is a statement called the "body" of the loop, and CONDITION is an expression that controls how long the loop keeps running. The first thing the `while' statement does is test the CONDITION. If the CONDITION is true, it executes the statement BODY. (The CONDITION is true when the value is not zero and not a null string.) After BODY has been executed, CONDITION is tested again, and if it is still true, BODY is executed again. This process repeats until the CONDITION is no longer true. If the CONDITION is initially false, the body of the loop is never executed and `awk' continues with the statement following the loop. This example prints the first three fields of each record, one per line: awk '{ i = 1 while (i <= 3) { print $i i++ } }' inventory-shipped The body of this loop is a compound statement enclosed in braces, containing two statements. The loop works in the following manner: first, the value of `i' is set to one. Then, the `while' statement tests whether `i' is less than or equal to three. This is true when `i' equals one, so the `i'-th field is printed. Then the `i++' increments the value of `i' and the loop repeats. The loop terminates when `i' reaches four. A newline is not required between the condition and the body; however using one makes the program clearer unless the body is a compound statement or else is very simple. The newline after the open-brace that begins the compound statement is not required either, but the program is harder to read without it.  File: gawk.info, Node: Do Statement, Next: For Statement, Prev: While Statement, Up: Statements 6.4.3 The `do'-`while' Statement -------------------------------- The `do' loop is a variation of the `while' looping statement. The `do' loop executes the BODY once and then repeats the BODY as long as the CONDITION is true. It looks like this: do BODY while (CONDITION) Even if the CONDITION is false at the start, the BODY is executed at least once (and only once, unless executing BODY makes CONDITION true). Contrast this with the corresponding `while' statement: while (CONDITION) BODY This statement does not execute BODY even once if the CONDITION is false to begin with. The following is an example of a `do' statement: { i = 1 do { print $0 i++ } while (i <= 10) } This program prints each input record 10 times. However, it isn't a very realistic example, since in this case an ordinary `while' would do just as well. This situation reflects actual experience; only occasionally is there a real use for a `do' statement.  File: gawk.info, Node: For Statement, Next: Switch Statement, Prev: Do Statement, Up: Statements 6.4.4 The `for' Statement ------------------------- The `for' statement makes it more convenient to count iterations of a loop. The general form of the `for' statement looks like this: for (INITIALIZATION; CONDITION; INCREMENT) BODY The INITIALIZATION, CONDITION, and INCREMENT parts are arbitrary `awk' expressions, and BODY stands for any `awk' statement. The `for' statement starts by executing INITIALIZATION. Then, as long as the CONDITION is true, it repeatedly executes BODY and then INCREMENT. Typically, INITIALIZATION sets a variable to either zero or one, INCREMENT adds one to it, and CONDITION compares it against the desired number of iterations. For example: awk '{ for (i = 1; i <= 3; i++) print $i }' inventory-shipped This prints the first three fields of each input record, with one field per line. It isn't possible to set more than one variable in the INITIALIZATION part without using a multiple assignment statement such as `x = y = 0'. This makes sense only if all the initial values are equal. (But it is possible to initialize additional variables by writing their assignments as separate statements preceding the `for' loop.) The same is true of the INCREMENT part. Incrementing additional variables requires separate statements at the end of the loop. The C compound expression, using C's comma operator, is useful in this context but it is not supported in `awk'. Most often, INCREMENT is an increment expression, as in the previous example. But this is not required; it can be any expression whatsoever. For example, the following statement prints all the powers of two between 1 and 100: for (i = 1; i <= 100; i *= 2) print i If there is nothing to be done, any of the three expressions in the parentheses following the `for' keyword may be omitted. Thus, `for (; x > 0;)' is equivalent to `while (x > 0)'. If the CONDITION is omitted, it is treated as true, effectively yielding an "infinite loop" (i.e., a loop that never terminates). In most cases, a `for' loop is an abbreviation for a `while' loop, as shown here: INITIALIZATION while (CONDITION) { BODY INCREMENT } The only exception is when the `continue' statement (*note Continue Statement::) is used inside the loop. Changing a `for' statement to a `while' statement in this way can change the effect of the `continue' statement inside the loop. The `awk' language has a `for' statement in addition to a `while' statement because a `for' loop is often both less work to type and more natural to think of. Counting the number of iterations is very common in loops. It can be easier to think of this counting as part of looping rather than as something to do inside the loop. There is an alternate version of the `for' loop, for iterating over all the indices of an array: for (i in array) DO SOMETHING WITH array[i] *Note Scanning an Array::, for more information on this version of the `for' loop.  File: gawk.info, Node: Switch Statement, Next: Break Statement, Prev: For Statement, Up: Statements 6.4.5 The `switch' Statement ---------------------------- NOTE: This node describes an experimental feature added in `gawk' 3.1.3. It is _not_ enabled by default. To enable it, use the `--enable-switch' option to `configure' when `gawk' is being configured and built. *Note Additional Configuration Options::, for more information. The `switch' statement allows the evaluation of an expression and the execution of statements based on a `case' match. Case statements are checked for a match in the order they are defined. If no suitable `case' is found, the `default' section is executed, if supplied. Each `case' contains a single constant, be it numeric, string, or regexp. The `switch' expression is evaluated, and then each `case''s constant is compared against the result in turn. The type of constant determines the comparison: numeric or string do the usual comparisons. A regexp constant does a regular expression match against the string value of the original expression. The general form of the `switch' statement looks like this: switch (EXPRESSION) { case VALUE OR REGULAR EXPRESSION: CASE-BODY default: DEFAULT-BODY } Control flow in the `switch' statement works as it does in C. Once a match to a given case is made, case statement bodies are executed until a `break', `continue', `next', `nextfile' or `exit' is encountered, or the end of the `switch' statement itself. For example: switch (NR * 2 + 1) { case 3: case "11": print NR - 1 break case /2[[:digit:]]+/: print NR default: print NR + 1 case -1: print NR * -1 } Note that if none of the statements specified above halt execution of a matched `case' statement, execution falls through to the next `case' until execution halts. In the above example, for any case value starting with `2' followed by one or more digits, the `print' statement is executed and then falls through into the `default' section, executing its `print' statement. In turn, the -1 case will also be executed since the `default' does not halt execution.  File: gawk.info, Node: Break Statement, Next: Continue Statement, Prev: Switch Statement, Up: Statements 6.4.6 The `break' Statement --------------------------- The `break' statement jumps out of the innermost `for', `while', or `do' loop that encloses it. The following example finds the smallest divisor of any integer, and also identifies prime numbers: # find smallest divisor of num { num = $1 for (div = 2; div*div <= num; div++) if (num % div == 0) break if (num % div == 0) printf "Smallest divisor of %d is %d\n", num, div else printf "%d is prime\n", num } When the remainder is zero in the first `if' statement, `awk' immediately "breaks out" of the containing `for' loop. This means that `awk' proceeds immediately to the statement following the loop and continues processing. (This is very different from the `exit' statement, which stops the entire `awk' program. *Note Exit Statement::.) Th following program illustrates how the CONDITION of a `for' or `while' statement could be replaced with a `break' inside an `if': # find smallest divisor of num { num = $1 for (div = 2; ; div++) { if (num % div == 0) { printf "Smallest divisor of %d is %d\n", num, div break } if (div*div > num) { printf "%d is prime\n", num break } } } The `break' statement has no meaning when used outside the body of a loop. However, although it was never documented, historical implementations of `awk' treated the `break' statement outside of a loop as if it were a `next' statement (*note Next Statement::). Recent versions of Unix `awk' no longer allow this usage. `gawk' supports this use of `break' only if `--traditional' has been specified on the command line (*note Options::). Otherwise, it is treated as an error, since the POSIX standard specifies that `break' should only be used inside the body of a loop. (d.c.)  File: gawk.info, Node: Continue Statement, Next: Next Statement, Prev: Break Statement, Up: Statements 6.4.7 The `continue' Statement ------------------------------ As with `break', the `continue' statement is used only inside `for', `while', and `do' loops. It skips over the rest of the loop body, causing the next cycle around the loop to begin immediately. Contrast this with `break', which jumps out of the loop altogether. The `continue' statement in a `for' loop directs `awk' to skip the rest of the body of the loop and resume execution with the increment-expression of the `for' statement. The following program illustrates this fact: BEGIN { for (x = 0; x <= 20; x++) { if (x == 5) continue printf "%d ", x } print "" } This program prints all the numbers from 0 to 20--except for 5, for which the `printf' is skipped. Because the increment `x++' is not skipped, `x' does not remain stuck at 5. Contrast the `for' loop from the previous example with the following `while' loop: BEGIN { x = 0 while (x <= 20) { if (x == 5) continue printf "%d ", x x++ } print "" } This program loops forever once `x' reaches 5. The `continue' statement has no meaning when used outside the body of a loop. Historical versions of `awk' treated a `continue' statement outside a loop the same way they treated a `break' statement outside a loop: as if it were a `next' statement (*note Next Statement::). Recent versions of Unix `awk' no longer work this way, and `gawk' allows it only if `--traditional' is specified on the command line (*note Options::). Just like the `break' statement, the POSIX standard specifies that `continue' should only be used inside the body of a loop. (d.c.)  File: gawk.info, Node: Next Statement, Next: Nextfile Statement, Prev: Continue Statement, Up: Statements 6.4.8 The `next' Statement -------------------------- The `next' statement forces `awk' to immediately stop processing the current record and go on to the next record. This means that no further rules are executed for the current record, and the rest of the current rule's action isn't executed. Contrast this with the effect of the `getline' function (*note Getline::). That also causes `awk' to read the next record immediately, but it does not alter the flow of control in any way (i.e., the rest of the current action executes with a new input record). At the highest level, `awk' program execution is a loop that reads an input record and then tests each rule's pattern against it. If you think of this loop as a `for' statement whose body contains the rules, then the `next' statement is analogous to a `continue' statement. It skips to the end of the body of this implicit loop and executes the increment (which reads another record). For example, suppose an `awk' program works only on records with four fields, and it shouldn't fail when given bad input. To avoid complicating the rest of the program, write a "weed out" rule near the beginning, in the following manner: NF != 4 { err = sprintf("%s:%d: skipped: NF != 4\n", FILENAME, FNR) print err > "/dev/stderr" next } Because of the `next' statement, the program's subsequent rules won't see the bad record. The error message is redirected to the standard error output stream, as error messages should be. For more detail see *note Special Files::. According to the POSIX standard, the behavior is undefined if the `next' statement is used in a `BEGIN' or `END' rule. `gawk' treats it as a syntax error. Although POSIX permits it, some other `awk' implementations don't allow the `next' statement inside function bodies (*note User-defined::). Just as with any other `next' statement, a `next' statement inside a function body reads the next record and starts processing it with the first rule in the program. If the `next' statement causes the end of the input to be reached, then the code in any `END' rules is executed. *Note BEGIN/END::.  File: gawk.info, Node: Nextfile Statement, Next: Exit Statement, Prev: Next Statement, Up: Statements 6.4.9 Using `gawk''s `nextfile' Statement ----------------------------------------- `gawk' provides the `nextfile' statement, which is similar to the `next' statement. However, instead of abandoning processing of the current record, the `nextfile' statement instructs `gawk' to stop processing the current data file. The `nextfile' statement is a `gawk' extension. In most other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), `nextfile' is not special. Upon execution of the `nextfile' statement, `FILENAME' is updated to the name of the next data file listed on the command line, `FNR' is reset to one, `ARGIND' is incremented, and processing starts over with the first rule in the program. (`ARGIND' hasn't been introduced yet. *Note Built-in Variables::.) If the `nextfile' statement causes the end of the input to be reached, then the code in any `END' rules is executed. *Note BEGIN/END::. The `nextfile' statement is useful when there are many data files to process but it isn't necessary to process every record in every file. Normally, in order to move on to the next data file, a program has to continue scanning the unwanted records. The `nextfile' statement accomplishes this much more efficiently. While one might think that `close(FILENAME)' would accomplish the same as `nextfile', this isn't true. `close' is reserved for closing files, pipes, and coprocesses that are opened with redirections. It is not related to the main processing that `awk' does with the files listed in `ARGV'. If it's necessary to use an `awk' version that doesn't support `nextfile', see *note Nextfile Function::, for a user-defined function that simulates the `nextfile' statement. The current version of the Bell Laboratories `awk' (*note Other Versions::) also supports `nextfile'. However, it doesn't allow the `nextfile' statement inside function bodies (*note User-defined::). `gawk' does; a `nextfile' inside a function body reads the next record and starts processing it with the first rule in the program, just as any other `nextfile' statement. *Caution:* Versions of `gawk' prior to 3.0 used two words (`next file') for the `nextfile' statement. In version 3.0, this was changed to one word, because the treatment of `file' was inconsistent. When it appeared after `next', `file' was a keyword; otherwise, it was a regular identifier. The old usage is no longer accepted; `next file' generates a syntax error.  File: gawk.info, Node: Exit Statement, Prev: Nextfile Statement, Up: Statements 6.4.10 The `exit' Statement --------------------------- The `exit' statement causes `awk' to immediately stop executing the current rule and to stop processing input; any remaining input is ignored. The `exit' statement is written as follows: exit [RETURN CODE] When an `exit' statement is executed from a `BEGIN' rule, the program stops processing everything immediately. No input records are read. However, if an `END' rule is present, as part of executing the `exit' statement, the `END' rule is executed (*note BEGIN/END::). If `exit' is used as part of an `END' rule, it causes the program to stop immediately. An `exit' statement that is not part of a `BEGIN' or `END' rule stops the execution of any further automatic rules for the current record, skips reading any remaining input records, and executes the `END' rule if there is one. In such a case, if you don't want the `END' rule to do its job, set a variable to nonzero before the `exit' statement and check that variable in the `END' rule. *Note Assert Function::, for an example that does this. If an argument is supplied to `exit', its value is used as the exit status code for the `awk' process. If no argument is supplied, `exit' returns status zero (success). In the case where an argument is supplied to a first `exit' statement, and then `exit' is called a second time from an `END' rule with no argument, `awk' uses the previously supplied exit value. (d.c.) For example, suppose an error condition occurs that is difficult or impossible to handle. Conventionally, programs report this by exiting with a nonzero status. An `awk' program can do this using an `exit' statement with a nonzero argument, as shown in the following example: BEGIN { if (("date" | getline date_now) <= 0) { print "Can't get system date" > "/dev/stderr" exit 1 } print "current date is", date_now close("date") }  File: gawk.info, Node: Built-in Variables, Prev: Statements, Up: Patterns and Actions 6.5 Built-in Variables ====================== Most `awk' variables are available to use for your own purposes; they never change unless your program assigns values to them, and they never affect anything unless your program examines them. However, a few variables in `awk' have special built-in meanings. `awk' examines some of these automatically, so that they enable you to tell `awk' how to do certain things. Others are set automatically by `awk', so that they carry information from the internal workings of `awk' to your program. This minor node documents all the built-in variables of `gawk', most of which are also documented in the chapters describing their areas of activity. * Menu: * User-modified:: Built-in variables that you change to control `awk'. * Auto-set:: Built-in variables where `awk' gives you information. * ARGC and ARGV:: Ways to use `ARGC' and `ARGV'.  File: gawk.info, Node: User-modified, Next: Auto-set, Up: Built-in Variables 6.5.1 Built-in Variables That Control `awk' ------------------------------------------- The following is an alphabetical list of variables that you can change to control how `awk' does certain things. The variables that are specific to `gawk' are marked with a pound sign (`#'). `BINMODE #' On non-POSIX systems, this variable specifies use of binary mode for all I/O. Numeric values of one, two, or three specify that input files, output files, or all files, respectively, should use binary I/O. Alternatively, string values of `"r"' or `"w"' specify that input files and output files, respectively, should use binary I/O. A string value of `"rw"' or `"wr"' indicates that all files should use binary I/O. Any other string value is equivalent to `"rw"', but `gawk' generates a warning message. `BINMODE' is described in more detail in *note PC Using::. This variable is a `gawk' extension. In other `awk' implementations (except `mawk', *note Other Versions::), or if `gawk' is in compatibility mode (*note Options::), it is not special. `CONVFMT' This string controls conversion of numbers to strings (*note Conversion::). It works by being passed, in effect, as the first argument to the `sprintf' function (*note String Functions::). Its default value is `"%.6g"'. `CONVFMT' was introduced by the POSIX standard. `FIELDWIDTHS #' This is a space-separated list of columns that tells `gawk' how to split input with fixed columnar boundaries. Assigning a value to `FIELDWIDTHS' overrides the use of `FS' for field splitting. *Note Constant Size::, for more information. If `gawk' is in compatibility mode (*note Options::), then `FIELDWIDTHS' has no special meaning, and field-splitting operations occur based exclusively on the value of `FS'. `FS' This is the input field separator (*note Field Separators::). The value is a single-character string or a multi-character regular expression that matches the separations between fields in an input record. If the value is the null string (`""'), then each character in the record becomes a separate field. (This behavior is a `gawk' extension. POSIX `awk' does not specify the behavior when `FS' is the null string.) The default value is `" "', a string consisting of a single space. As a special exception, this value means that any sequence of spaces, tabs, and/or newlines is a single separator.(1) It also causes spaces, tabs, and newlines at the beginning and end of a record to be ignored. You can set the value of `FS' on the command line using the `-F' option: awk -F, 'PROGRAM' INPUT-FILES If `gawk' is using `FIELDWIDTHS' for field splitting, assigning a value to `FS' causes `gawk' to return to the normal, `FS'-based field splitting. An easy way to do this is to simply say `FS = FS', perhaps with an explanatory comment. `IGNORECASE #' If `IGNORECASE' is nonzero or non-null, then all string comparisons and all regular expression matching are case independent. Thus, regexp matching with `~' and `!~', as well as the `gensub', `gsub', `index', `match', `split', and `sub' functions, record termination with `RS', and field splitting with `FS', all ignore case when doing their particular regexp operations. However, the value of `IGNORECASE' does _not_ affect array subscripting and it does not affect field splitting when using a single-character field separator. *Note Case-sensitivity::. If `gawk' is in compatibility mode (*note Options::), then `IGNORECASE' has no special meaning. Thus, string and regexp operations are always case-sensitive. `LINT #' When this variable is true (nonzero or non-null), `gawk' behaves as if the `--lint' command-line option is in effect. (*note Options::). With a value of `"fatal"', lint warnings become fatal errors. With a value of `"invalid"', only warnings about things that are actually invalid are issued. (This is not fully implemented yet.) Any other true value prints nonfatal warnings. Assigning a false value to `LINT' turns off the lint warnings. This variable is a `gawk' extension. It is not special in other `awk' implementations. Unlike the other special variables, changing `LINT' does affect the production of lint warnings, even if `gawk' is in compatibility mode. Much as the `--lint' and `--traditional' options independently control different aspects of `gawk''s behavior, the control of lint warnings during program execution is independent of the flavor of `awk' being executed. `OFMT' This string controls conversion of numbers to strings (*note Conversion::) for printing with the `print' statement. It works by being passed as the first argument to the `sprintf' function (*note String Functions::). Its default value is `"%.6g"'. Earlier versions of `awk' also used `OFMT' to specify the format for converting numbers to strings in general expressions; this is now done by `CONVFMT'. `OFS' This is the output field separator (*note Output Separators::). It is output between the fields printed by a `print' statement. Its default value is `" "', a string consisting of a single space. `ORS' This is the output record separator. It is output at the end of every `print' statement. Its default value is `"\n"', the newline character. (*Note Output Separators::.) `RS' This is `awk''s input record separator. Its default value is a string containing a single newline character, which means that an input record consists of a single line of text. It can also be the null string, in which case records are separated by runs of blank lines. If it is a regexp, records are separated by matches of the regexp in the input text. (*Note Records::.) The ability for `RS' to be a regular expression is a `gawk' extension. In most other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), just the first character of `RS''s value is used. `SUBSEP' This is the subscript separator. It has the default value of `"\034"' and is used to separate the parts of the indices of a multidimensional array. Thus, the expression `foo["A", "B"]' really accesses `foo["A\034B"]' (*note Multi-dimensional::). `TEXTDOMAIN #' This variable is used for internationalization of programs at the `awk' level. It sets the default text domain for specially marked string constants in the source text, as well as for the `dcgettext', `dcngettext' and `bindtextdomain' functions (*note Internationalization::). The default value of `TEXTDOMAIN' is `"messages"'. This variable is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not special. ---------- Footnotes ---------- (1) In POSIX `awk', newline does not count as whitespace.  File: gawk.info, Node: Auto-set, Next: ARGC and ARGV, Prev: User-modified, Up: Built-in Variables 6.5.2 Built-in Variables That Convey Information ------------------------------------------------ The following is an alphabetical list of variables that `awk' sets automatically on certain occasions in order to provide information to your program. The variables that are specific to `gawk' are marked with a pound sign (`#'). `ARGC, ARGV' The command-line arguments available to `awk' programs are stored in an array called `ARGV'. `ARGC' is the number of command-line arguments present. *Note Other Arguments::. Unlike most `awk' arrays, `ARGV' is indexed from 0 to `ARGC' - 1. In the following example: $ awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' inventory-shipped BBS-list -| awk -| inventory-shipped -| BBS-list `ARGV[0]' contains `"awk"', `ARGV[1]' contains `"inventory-shipped"', and `ARGV[2]' contains `"BBS-list"'. The value of `ARGC' is three, one more than the index of the last element in `ARGV', because the elements are numbered from zero. The names `ARGC' and `ARGV', as well as the convention of indexing the array from 0 to `ARGC' - 1, are derived from the C language's method of accessing command-line arguments. The value of `ARGV[0]' can vary from system to system. Also, you should note that the program text is _not_ included in `ARGV', nor are any of `awk''s command-line options. *Note ARGC and ARGV::, for information about how `awk' uses these variables. `ARGIND #' The index in `ARGV' of the current file being processed. Every time `gawk' opens a new data file for processing, it sets `ARGIND' to the index in `ARGV' of the file name. When `gawk' is processing the input files, `FILENAME == ARGV[ARGIND]' is always true. This variable is useful in file processing; it allows you to tell how far along you are in the list of data files as well as to distinguish between successive instances of the same file name on the command line. While you can change the value of `ARGIND' within your `awk' program, `gawk' automatically sets it to a new value when the next file is opened. This variable is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not special. `ENVIRON' An associative array that contains the values of the environment. The array indices are the environment variable names; the elements are the values of the particular environment variables. For example, `ENVIRON["HOME"]' might be `/home/arnold'. Changing this array does not affect the environment passed on to any programs that `awk' may spawn via redirection or the `system' function. Some operating systems may not have environment variables. On such systems, the `ENVIRON' array is empty (except for `ENVIRON["AWKPATH"]', *note AWKPATH Variable::). `ERRNO #' If a system error occurs during a redirection for `getline', during a read for `getline', or during a `close' operation, then `ERRNO' contains a string describing the error. `ERRNO' works similarly to the C variable `errno'. In particular `gawk' _never_ clears it (sets it to zero or `""'). Thus, you should only expect its value to be meaningful when an I/O operation returns a failure value, such as `getline' returning -1. You are, of course, free to clear it yourself before doing an I/O operation. This variable is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not special. `FILENAME' The name of the file that `awk' is currently reading. When no data files are listed on the command line, `awk' reads from the standard input and `FILENAME' is set to `"-"'. `FILENAME' is changed each time a new file is read (*note Reading Files::). Inside a `BEGIN' rule, the value of `FILENAME' is `""', since there are no input files being processed yet.(1) (d.c.) Note, though, that using `getline' (*note Getline::) inside a `BEGIN' rule can give `FILENAME' a value. `FNR' The current record number in the current file. `FNR' is incremented each time a new record is read (*note Getline::). It is reinitialized to zero each time a new input file is started. `NF' The number of fields in the current input record. `NF' is set each time a new record is read, when a new field is created or when `$0' changes (*note Fields::). Unlike most of the variables described in this node, assigning a value to `NF' has the potential to affect `awk''s internal workings. In particular, assignments to `NF' can be used to create or remove fields from the current record: *Note Changing Fields::. `NR' The number of input records `awk' has processed since the beginning of the program's execution (*note Records::). `NR' is incremented each time a new record is read. `PROCINFO #' The elements of this array provide access to information about the running `awk' program. The following elements (listed alphabetically) are guaranteed to be available: `PROCINFO["egid"]' The value of the `getegid' system call. `PROCINFO["euid"]' The value of the `geteuid' system call. `PROCINFO["FS"]' This is `"FS"' if field splitting with `FS' is in effect, or it is `"FIELDWIDTHS"' if field splitting with `FIELDWIDTHS' is in effect. `PROCINFO["gid"]' The value of the `getgid' system call. `PROCINFO["pgrpid"]' The process group ID of the current process. `PROCINFO["pid"]' The process ID of the current process. `PROCINFO["ppid"]' The parent process ID of the current process. `PROCINFO["uid"]' The value of the `getuid' system call. `PROCINFO["version"]' The version of `gawk'. This is available from version 3.1.4 and later. On some systems, there may be elements in the array, `"group1"' through `"groupN"' for some N. N is the number of supplementary groups that the process has. Use the `in' operator to test for these elements (*note Reference to Elements::). This array is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not special. `RLENGTH' The length of the substring matched by the `match' function (*note String Functions::). `RLENGTH' is set by invoking the `match' function. Its value is the length of the matched string, or -1 if no match is found. `RSTART' The start-index in characters of the substring that is matched by the `match' function (*note String Functions::). `RSTART' is set by invoking the `match' function. Its value is the position of the string where the matched substring starts, or zero if no match was found. `RT #' This is set each time a record is read. It contains the input text that matched the text denoted by `RS', the record separator. This variable is a `gawk' extension. In other `awk' implementations, or if `gawk' is in compatibility mode (*note Options::), it is not special. Advanced Notes: Changing `NR' and `FNR' --------------------------------------- `awk' increments `NR' and `FNR' each time it reads a record, instead of setting them to the absolute value of the number of records read. This means that a program can change these variables and their new values are incremented for each record. (d.c.) This is demonstrated in the following example: $ echo '1 > 2 > 3 > 4' | awk 'NR == 2 { NR = 17 } > { print NR }' -| 1 -| 17 -| 18 -| 19 Before `FNR' was added to the `awk' language (*note V7/SVR3.1::), many `awk' programs used this feature to track the number of records in a file by resetting `NR' to zero when `FILENAME' changed. ---------- Footnotes ---------- (1) Some early implementations of Unix `awk' initialized `FILENAME' to `"-"', even if there were data files to be processed. This behavior was incorrect and should not be relied upon in your programs.  File: gawk.info, Node: ARGC and ARGV, Prev: Auto-set, Up: Built-in Variables 6.5.3 Using `ARGC' and `ARGV' ----------------------------- *note Auto-set::, presented the following program describing the information contained in `ARGC' and `ARGV': $ awk 'BEGIN { > for (i = 0; i < ARGC; i++) > print ARGV[i] > }' inventory-shipped BBS-list -| awk -| inventory-shipped -| BBS-list In this example, `ARGV[0]' contains `awk', `ARGV[1]' contains `inventory-shipped', and `ARGV[2]' contains `BBS-list'. Notice that the `awk' program is not entered in `ARGV'. The other special command-line options, with their arguments, are also not entered. This includes variable assignments done with the `-v' option (*note Options::). Normal variable assignments on the command line _are_ treated as arguments and do show up in the `ARGV' array: $ cat showargs.awk -| BEGIN { -| printf "A=%d, B=%d\n", A, B -| for (i = 0; i < ARGC; i++) -| printf "\tARGV[%d] = %s\n", i, ARGV[i] -| } -| END { printf "A=%d, B=%d\n", A, B } $ awk -v A=1 -f showargs.awk B=2 /dev/null -| A=1, B=0 -| ARGV[0] = awk -| ARGV[1] = B=2 -| ARGV[2] = /dev/null -| A=1, B=2 A program can alter `ARGC' and the elements of `ARGV'. Each time `awk' reaches the end of an input file, it uses the next element of `ARGV' as the name of the next input file. By storing a different string there, a program can change which files are read. Use `"-"' to represent the standard input. Storing additional elements and incrementing `ARGC' causes additional files to be read. If the value of `ARGC' is decreased, that eliminates input files from the end of the list. By recording the old value of `ARGC' elsewhere, a program can treat the eliminated arguments as something other than file names. To eliminate a file from the middle of the list, store the null string (`""') into `ARGV' in place of the file's name. As a special feature, `awk' ignores file names that have been replaced with the null string. Another option is to use the `delete' statement to remove elements from `ARGV' (*note Delete::). All of these actions are typically done in the `BEGIN' rule, before actual processing of the input begins. *Note Split Program::, and see *note Tee Program::, for examples of each way of removing elements from `ARGV'. The following fragment processes `ARGV' in order to examine, and then remove, command-line options: BEGIN { for (i = 1; i < ARGC; i++) { if (ARGV[i] == "-v") verbose = 1 else if (ARGV[i] == "-d") debug = 1 else if (ARGV[i] ~ /^-./) { e = sprintf("%s: unrecognized option -- %c", ARGV[0], substr(ARGV[i], 2, 1)) print e > "/dev/stderr" } else break delete ARGV[i] } } To actually get the options into the `awk' program, end the `awk' options with `--' and then supply the `awk' program's options, in the following manner: awk -f myprog -- -v -d file1 file2 ... This is not necessary in `gawk'. Unless `--posix' has been specified, `gawk' silently puts any unrecognized options into `ARGV' for the `awk' program to deal with. As soon as it sees an unknown option, `gawk' stops looking for other options that it might otherwise recognize. The previous example with `gawk' would be: gawk -f myprog -d -v file1 file2 ... Because `-d' is not a valid `gawk' option, it and the following `-v' are passed on to the `awk' program.  File: gawk.info, Node: Arrays, Next: Functions, Prev: Patterns and Actions, Up: Top 7 Arrays in `awk' ***************** An "array" is a table of values called "elements". The elements of an array are distinguished by their indices. "Indices" may be either numbers or strings. This major node describes how arrays work in `awk', how to use array elements, how to scan through every element in an array, and how to remove array elements. It also describes how `awk' simulates multidimensional arrays, as well as some of the less obvious points about array usage. The major node finishes with a discussion of `gawk''s facility for sorting an array based on its indices. `awk' maintains a single set of names that may be used for naming variables, arrays, and functions (*note User-defined::). Thus, you cannot have a variable and an array with the same name in the same `awk' program. * Menu: * Array Intro:: Introduction to Arrays * Reference to Elements:: How to examine one element of an array. * Assigning Elements:: How to change an element of an array. * Array Example:: Basic Example of an Array * Scanning an Array:: A variation of the `for' statement. It loops through the indices of an array's existing elements. * Delete:: The `delete' statement removes an element from an array. * Numeric Array Subscripts:: How to use numbers as subscripts in `awk'. * Uninitialized Subscripts:: Using Uninitialized variables as subscripts. * Multi-dimensional:: Emulating multidimensional arrays in `awk'. * Multi-scanning:: Scanning multidimensional arrays. * Array Sorting:: Sorting array values and indices.  File: gawk.info, Node: Array Intro, Next: Reference to Elements, Up: Arrays 7.1 Introduction to Arrays ========================== The `awk' language provides one-dimensional arrays for storing groups of related strings or numbers. Every `awk' array must have a name. Array names have the same syntax as variable names; any valid variable name would also be a valid array name. But one name cannot be used in both ways (as an array and as a variable) in the same `awk' program. Arrays in `awk' superficially resemble arrays in other programming languages, but there are fundamental differences. In `awk', it isn't necessary to specify the size of an array before starting to use it. Additionally, any number or string in `awk', not just consecutive integers, may be used as an array index. In most other languages, arrays must be "declared" before use, including a specification of how many elements or components they contain. In such languages, the declaration causes a contiguous block of memory to be allocated for that many elements. Usually, an index in the array must be a positive integer. For example, the index zero specifies the first element in the array, which is actually stored at the beginning of the block of memory. Index one specifies the second element, which is stored in memory right after the first element, and so on. It is impossible to add more elements to the array, because it has room only for as many elements as given in the declaration. (Some languages allow arbitrary starting and ending indices--e.g., `15 .. 27'--but the size of the array is still fixed when the array is declared.) A contiguous array of four elements might look like the following example, conceptually, if the element values are 8, `"foo"', `""', and 30: +---------+---------+--------+---------+ | 8 | "foo" | "" | 30 | Value +---------+---------+--------+---------+ 0 1 2 3 Index Only the values are stored; the indices are implicit from the order of the values. Here, 8 is the value at index zero, because 8 appears in the position with zero elements before it. Arrays in `awk' are different--they are "associative". This means that each array is a collection of pairs: an index and its corresponding array element value: Element 3 Value 30 Element 1 Value "foo" Element 0 Value 8 Element 2 Value "" The pairs are shown in jumbled order because their order is irrelevant. One advantage of associative arrays is that new pairs can be added at any time. For example, suppose a tenth element is added to the array whose value is `"number ten"'. The result is: Element 10 Value "number ten" Element 3 Value 30 Element 1 Value "foo" Element 0 Value 8 Element 2 Value "" Now the array is "sparse", which just means some indices are missing. It has elements 0-3 and 10, but doesn't have elements 4, 5, 6, 7, 8, or 9. Another consequence of associative arrays is that the indices don't have to be positive integers. Any number, or even a string, can be an index. For example, the following is an array that translates words from English to French: Element "dog" Value "chien" Element "cat" Value "chat" Element "one" Value "un" Element 1 Value "un" Here we decided to translate the number one in both spelled-out and numeric form--thus illustrating that a single array can have both numbers and strings as indices. In fact, array subscripts are always strings; this is discussed in more detail in *note Numeric Array Subscripts::. Here, the number `1' isn't double-quoted, since `awk' automatically converts it to a string. The value of `IGNORECASE' has no effect upon array subscripting. The identical string value used to store an array element must be used to retrieve it. When `awk' creates an array (e.g., with the `split' built-in function), that array's indices are consecutive integers starting at one. (*Note String Functions::.) `awk''s arrays are efficient--the time to access an element is independent of the number of elements in the array.  File: gawk.info, Node: Reference to Elements, Next: Assigning Elements, Prev: Array Intro, Up: Arrays 7.2 Referring to an Array Element ================================= The principal way to use an array is to refer to one of its elements. An array reference is an expression as follows: ARRAY[INDEX] Here, ARRAY is the name of an array. The expression INDEX is the index of the desired element of the array. The value of the array reference is the current value of that array element. For example, `foo[4.3]' is an expression for the element of array `foo' at index `4.3'. A reference to an array element that has no recorded value yields a value of `""', the null string. This includes elements that have not been assigned any value as well as elements that have been deleted (*not